perm filename DFTP.MAC[NET,MRC]19 blob sn#307311 filedate 1977-09-14 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00123 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00011 00002		TITLE DFTP  Datacomputer File Transfer Program
C00016 00003		SUBTTL Definitions
C00017 00004		SUBTTL Macro Definitions for "Routines"
C00020 00005		SUBTTL Other Macro definitions
C00022 00006	DEFINE	XTCIL <		(e)X(pand) T(erminal) C(ommand) I(nput) L(ist)
C00023 00007		SUBTTL System Dependent Definitions for ITS
C00027 00008		SUBTTL System Dependent Definitions for TOPS-10
C00030 00009		SUBTTL System Dependent Definitions for TENEX
C00032 00010		SUBTTL Main Program
C00035 00011		SUBTTL Terminal Input Dispatch Tables
C00037 00012		SUBTTL Top level commands
C00043 00013	 (((ITS)))
C00044 00014	 (((TOPS-10)))
C00046 00015	CLOU:
C00049 00016	CNOD:	SETZM	FLAGDD
C00051 00017	CSOD:	SETOM	FLAGDD
C00053 00018		SUBTTL Path input and translation
C00058 00019	 PATH INPUT
C00071 00020	 P$PP -- PROCESS PATH (NODES AND FILES)
C00074 00021	 CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
C00077 00022	 LOCAL FILE NAME PREPARATION
C00079 00023		SUBTTL Datacomputer interface routines
C00080 00024	 DBIG -- CREATE A <BIG> FILE
C00082 00025	 DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
C00088 00026	 DCON -- CONNECT (VERIFY CONTEXT)
C00089 00027	 DDEL -- DELETE FILES
C00091 00028	 DDIR -- FILE DIRECTORY
C00094 00029	 DD$D -- DELETED FILES
C00095 00030	 DEXA -- EXAMINE (LIST FILES TO TERMINAL)
C00099 00031	 DEXP -- EXPUNGE
C00102 00032	 DGET -- GET-RETRIEVE
C00104 00033	 DLIN -- DATACOMPUTER LINK
C00105 00034	 DLIS -- NODE DIRECTORY
C00108 00035	 DL$T -- TERSE NODES
C00110 00036	 DL$P -- PROTECTION
C00111 00037	 DL$NAM -- DIRECTORY: NAME OUTPUT
C00114 00038	 DPUT -- PUT-STORE
C00118 00039	 DREM -- DELETE NODES
C00119 00040	 DREN -- RENUMBER FILES
C00122 00041	 DUND -- UNDELETE
C00124 00042	 D$INIT -- INITIALIZE DATACOMPUTER SESSION
C00129 00043	 D$CON -- CONNECT
C00130 00044	 D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
C00133 00045	 D$VER -- PRODUCE PROPER VERSION NUMBER
C00139 00046	 D$VEX -- VERIFY THAT VERSION EXISTS
C00141 00047	 D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
C00143 00048	 NETSUM -- NETWORK CHECKSUM VERIFICATION
C00145 00049	 RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
C00149 00050	 DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
C00150 00051		SUBTTL I/O Routines
C00151 00052	 TERMINAL COMMAND INPUT ROUTINE
C00158 00053	 TERMINAL STRING INPUT
C00160 00054	 TERMINAL NUMBER INPUT
C00162 00055	 DCNIN -- DATACOMPUTER NUMBER INPUT
C00163 00056	 $NOUT$ -- INTEGER OUTPUT
C00164 00057		SUBTTL System Dependent Routines for ITS
C00169 00058	 NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
C00171 00059	 LOCOI -- LOCAL OPEN INPUT (FILE)
C00173 00060	 LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
C00175 00061	 LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
C00177 00062	 LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
C00179 00063	 NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
C00181 00064	 PUTFIL -- PUT-STORE FILE INFORMATION
C00183 00065	 PUTDAT -- MOVE DATA: LOCAL TO NETWORK (PUT)
C00185 00066	 EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
C00188 00067	 GETFIL -- GET-RETRIEVE FILE INFORMATION
C00190 00068	 GETDAT -- GET-RETRIEVE FILE DATA
C00192 00069	 NETMSG -- HANDLE PENDING MESSAGES
C00193 00070	 LOCFFI -- LOCAL FIRST FILE FOR INPUT
C00196 00071	 LOCNFI -- LOCAL NEXT FILE FOR INPUT
C00199 00072	 LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
C00201 00073		SUBTTL System Dependent Routines for TOPS-10
C00202 00074	 GETFIL -- GET-RETRIEVE FILE INFORMATION
C00204 00075	 GETDAT -- GET-RETRIEVE FILE DATA
C00207 00076	 PUTFIL -- PUT-STORE FILE INFORMATION
C00209 00077	 PUTDAT -- PUT-STORE FILE DATA
C00211 00078	 EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
C00214 00079	 TOPS-10 ICP:		1) SET CONNECTION SOCKETS IN LISTENING STATE
C00224 00080	 NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
C00225 00081	 NETOI -- NETWORK OPEN INPUT (DATA)
C00227 00082	 NETOO -- NETWORK OPEN OUTPUT (DATA)
C00229 00083	 NETC -- NETWORK CLOSE (DATA)
C00230 00084	 (((SAIL)))
C00232 00085	 NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
C00233 00086	 NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
C00234 00087	 NETWORK UTILITY -- MESSAGE INPUT
C00236 00088	 NETWORK UTILITY -- FILL A DESIGNATED BUFFER
C00238 00089	 FATAL NETWORK ERROR MESSAGES
C00240 00090	 (((SAIL)))
C00241 00091	 LOCOI -- LOCAL OPEN INPUT (FILE)
C00244 00092	 LOCC -- LOCAL CLOSE (FILE)
C00245 00093	 LOCFFI -- LOCAL FIRST FILE FOR INPUT
C00247 00094	 LOCNFI -- LOCAL NEXT FILE FOR INPUT
C00249 00095	 LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
C00250 00096	 LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
C00252 00097	 LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
C00254 00098	 LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
C00256 00099	 LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
C00259 00100	 OOPS -- THE IMPOSSIBLE HAS HAPPENED
C00261 00101		SUBTTL System Dependent Routines for TENEX
C00263 00102	 GETFIL -- GET-RETRIEVE FILE INFORMATION
C00265 00103	 GETDAT -- GET-RETRIEVE FILE DATA
C00268 00104	 PUTFIL -- PUT-STORE FILE INFORMATION
C00270 00105	 PUTDAT -- PUT-STORE FILE DATA
C00272 00106	 EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
C00276 00107	 TENEX ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
C00278 00108	 NETWORK QUIT
C00279 00109	 NETOI -- NETWORK OPEN INPUT (DATA)
C00281 00110	 NETC -- NETWORK CLOSE (DATA)
C00282 00111	 NETMSG -- HANDLE PENDING MESSAGES
C00283 00112	 NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
C00284 00113	 NETFFI -- NETWORK FIX FIRST FILE NAME
C00285 00114	 FATAL NETWORK ERROR MESSAGES
C00286 00115	 LOCOI -- LOCAL OPEN INPUT (FILE)
C00288 00116	 LOCC -- LOCAL CLOSE (FILE)
C00289 00117	 LOCFFI -- LOCAL FIRST FILE FOR INPUT
C00290 00118	 LOCNFI -- LOCAL NEXT FILE FOR INPUT
C00292 00119	 LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
C00294 00120	 LUTVF -- LOCAL UTILITY: VERIFY FILENAME
C00296 00121	 PSEUDO-INTERRUPT ROUTINES
C00299 00122		SUBTTL Pure Data
C00301 00123		SUBTTL Impure Data
C00307 ENDMK
C⊗;
	TITLE DFTP  Datacomputer File Transfer Program
	SUBTTL General information, switches, definitions, etc.

; Current DFTP hackers:	WRB@CCA (general, TENEX, TOPS-10)
;			MRC@SU-AI (all versions)
;			Gumpertz@CMU-10a (CMU, TOPS-10)
; Bugs/Gripes to Bug-DFTP at MIT-AI, which mails to all interested parties.

; The source for this program is kept:
; At CCA in <DC-USER>.  This is the CCA-maintained version.  Requests
;	for modifying it should be sent in advance to HELP@CCA.
; On the DATACOMPUTER as  <<<COMMON>DATACOMPUTER>DFTP.MAC
;	This is the most recent DFTP for TENEX, TOPS-20, TOPS-10, CMU and
;	possibly ITS and SAIL as well.
; At MIT-AI as  DSK:MRC;DFTP >  (should be the same as the Datacomputer
;	version; the most recent working ITS version is  DSK:MRC;DFTP <
;	which might be the same file).
; At SU-AI as  DSK:DFTP.MAC[NET,MRC].  This is the most recent working
;	SAIL version, and is in SAIL "ETV" format.

IFNDEF F.TENX,<F.TENX==1>	; -1 IF ITS, 0 IF TOPS-10, 1 IF TENEX/TWENEX
IFNDEF F.PCAP,<F.PCAP==0>	; 0 IF PRIVILEGED CAPABILITIES UNRESTRICTED

IFNDEF F.SAIL,<F.SAIL==0>	; -1 IF TOPS-10 VERSION FOR SAIL
IFNDEF F.CMU,<F.CMU==0>		; -1 IF TOPS-10 VERSION FOR CMU
IFN F.SAIL!F.CMU,<F.TENX==0>

IF1,<
IFL F.TENX,<PRINTX ITS DFTP...>
IFE F.TENX,<
	IFE F.SAIL!F.CMU,<PRINTX TOPS-10 DFTP...>
	IFN F.SAIL,<PRINTX SAIL DFTP...>
	IFN F.CMU,<PRINTX CMU DFTP...>
>;IFE F.TENX
IFG F.TENX,<PRINTX TENEX/TOPS-20 DFTP...>
IFN F.PCAP,<PRINTX Privileged capabilities restricted>
IFE F.PCAP,<PRINTX Privileged capabilities unrestricted>
>
IF2,<PRINTX ...is halfway...>

; REGISTER DEFINITIONS

	R1==1
	R2==2
	R3==3
	R4==4
	R5==5
	R6==6
	R7==7
	R10==10
	R11==11
	R12==12
	R13==13
	R14==14
	R15==15
	R16==16
	R17==17

;	(SCRATCH REGISTERS)
	X1==1
	X2==2
	X3==3
	X4==4

;	(COMMONLY USED REGISTERS)
	IO==R5
	BP==R6
	FLAG==R15
	UTIL==R16
	STAK==R17

;	(TERMINAL COMMAND INPUT (RECOGNIZER) REGISTERS)
	TCIO==R2		; IO(REGISTER)
	TCIBP==R3		; B(YTE)P(OINTER)
	TCIACB==R4		; A(DDRESSOF)C(ONTROL)B(LOCK)
	TCITLP==R5		; T(RACE)L(IST)P(OINTER)
	TCITCC==R6		; T(RACE)C(OMMAND)C(OUNTER)
	TCIPBP==R7		; P(ARALLEL)B(YTE)P(OINTER)
	TCIPCC==R10		; P(ARALLEL)C(HARACTER)C(OUNTER)
	TCISBP==R11		; S(ERIAL)B(YTE)P(OINTER)
	TCISCC==R12		; S(ERIAL)C(HARACTER)C(OUNTER)
	TCIMAC==R13		; MA(TCHES--)C(OMMANDS)
	TCIMAN==R14		; MA(TCHES--)N(ULLCHARACTER)

IFN 0,<	;.XCREF is for the "@" listing program and should be ignored by MACRO-10
	.XCREF R1,R2,R3,R4,R5,R6,R7,R10,R11,R12,R13,R14,R15,R16,R17
	.XCREF X1,X2,X3,X4,IO,BP,FLAG,UTIL,STAK
>;IFN 0
	SUBTTL Definitions

	DCHOST==37
	DCSOKT==203

	DEFALO==12

	SIZBLK==200
	SIZPAG==1000

	LBSIZE==100
	SBSIZE==20
	SUBTTL Macro Definitions for "Routines"

	SALL

DEFINE	BEGINR(SAVLST,%RETN)
<	..SAVL==0
	..SAVC==0
	IFIDN <SAVLST><ALL>,<..SAVL==77777>
	IFDIF <SAVLST><ALL>,<
		IRP SAVLST,<
			IFG <SAVLST>-20,<!!
				PRINTX SAVLST NOT A REGISTER>
			IFLE <SAVLST>-20,<
				IFN ..SAVL&1←SAVLST,<!!
					PRINTX SAVLST SAVED TWICE>
				..SAVL==..SAVL!1←SAVLST
				..SAVC==..SAVC+1>>>
	IFN ..SAVL,<
		..REG==17
		REPEAT 20,<
			IFN ..SAVL&1←..REG,<PUSH STAK,..REG>
			..REG==..REG-1>>
	DEFINE	.%RETN <%RETN>	; UNIQUE LOCATION FOR RETURN AND ENDR
	DEFINE	.%RETL <%RETN':!>
	..SFLG==0		; LARGEST SKIP RETURN
>

; IF RETURN CAN'T BE POPJ, THEN IT ASSEMBLES AS JRST TO ENDR CODE
;   JRST TO .%RETN FOR NOSKIP RETURN, .%RETN-N FOR SKIP RETURN
;   ..SFLG SIGNALS THAT SKIP CODE MUST BE ASSEMBLED IN ENDR
DEFINE	RETURN(SK,N)
<<IFB <SK>,<<IFE ..SAVC,<POPJ STAK,.%RETN>>+<IFN ..SAVC,<JRST .%RETN>>>>+<IFIDN <SK><SKIP>,<<IFG N-..SFLG,<..SFLG==N>>*0+<JRST .%RETN-N>>>>

; RETURN FOR USE WITH CONDITIONAL JUMPS
DEFINE	RETN(N)
<<IFB <N>,<<IFE ..SAVC,<.%RETN>>+<IFN ..SAVC,<.%RETN>>>>+<IFNB <N>,<<IFG N-..SFLG,<..SFLG==N>>*0+<.%RETN-N>>>>

; ENDR DECRIMENTS STAK, RESTORES REGS, RETURNS (POSSIBLY SKIPPING)
DEFINE	ENDR(SK,N)
<	IFB <SK>,<..N==0>
	IFIDN <SK><SKIP>,<..N==N
		IFG <..N-..SFLG>,<..SFLG==..N>>
	IFN <..SFLG>,<IFN <..N-..SFLG>,<JRST .%RETN-..N>
		REPEAT ..SFLG,<
			AOS -..SAVC(STAK)>>
	.%RETL
	..REG==0
	REPEAT 20,<
		IFN ..SAVL&1←..REG,<POP STAK,..REG
			..SAVL==..SAVL-1←..REG>
		..REG==..REG+1>
	POPJ STAK,>

DEFINE	CALLR(ROUTIN)
<	PUSHJ	STAK,ROUTIN>
	SUBTTL Other Macro definitions

DEFINE	TAIN(MSG)
<	HRRZI	X1,MSG
	CALLR	$TAIN$>

DEFINE	TCIN(CLIST,RSTR)
<	MOVE	TCIO,[RSTR,,CLIST]
	CALLR	$TCIN$>

DEFINE	TSIN(BUFFER,BUFS,MSG,NOECHO)
<	MOVE	IO,[BUFFER,,<5*BUFS>-1]
	IFB <NOECHO>,< HRRZI	UTIL,MSG>
	IFNB <NOECHO>,< HRROI	UTIL,MSG>
	CALLR	$TSIN$>

DEFINE	TNIN(MSG,RADIX)
<	IFB <RADIX>,< MOVE	IO,[MSG,,↑D10]>
	IFNB <RADIX>,< MOVE	IO,[MSG,,RADIX]>
	CALLR	$TNIN$>

DEFINE	TNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE	X1,REG>
	IFB <RADIX>,< HRRZI	X2,↑D10>
	IFNB <RADIX>,< HRRZI	X2,RADIX>
	CALLR	$NOUT$>

DEFINE	DCNOUT(REG,RADIX)
<	IFN <X1-REG>,< MOVE	X1,REG>
	IFB <RADIX>,< HRROI	X2,↑D10>
	IFNB <RADIX>,< HRROI	X2,RADIX>
	CALLR	$NOUT$>

DEFINE	PATH(STRING,FLAGS)
<	IFB <FLAGS>,< HRRZI	FLAG,STRING>
	IFNB <FLAGS>,<
		HRRI	FLAG,STRING
		HRLI	FLAG,FLAGS>
	CALLR	$PATH$>

DEFINE	SCOPY(SOURCE,DESTIN)
<	CAIA
	 IDPB	0,DESTIN
	ILDB	0,SOURCE
	JUMPN	0,.-2
	MOVE	SOURCE,DESTIN
	IDPB	0,SOURCE
>;SCOPY
DEFINE	XTCIL <		;(e)X(pand) T(erminal) C(ommand) I(nput) L(ist)
	..CMCH==0
	..CMWD==0
	..CNUM==0
	DEFINE TCIE (NAME, ROUTINE)
	<	..CNUM==..CNUM+1
		..IDX==0
		IRPC NAME<..IDX==..IDX+1>
		IFG <..IDX-..CMCH>,<..CMCH==..IDX>
	>;TCIE
	TCIL
	..CMWD==<<<..CMCH-1>/5>+1>

	.+4+..CNUM
	..CNUM
	..CMCH
	..CMWD

	DEFINE TCIE (NAME,ROUTINE)
	<	ROUTINE
	>;TCIE
	TCIL

	DEFINE TCIE (NAME,ROUTINE)
	<	ASCII	/NAME/
		..IDX==0
		IRPC NAME<..IDX==..IDX+1>
		..IDX==<..CMWD-<<<..IDX-1>/5>+1>>
		IFG ..IDX,<REPEAT ..IDX, <0>>
	>;TCIE
	TCIL
>;XTCIL
	SUBTTL System Dependent Definitions for ITS

IFL F.TENX,<DEFINE RELOC(ADDR)<LOC ADDR>>	; ABS ASSEMBLY ON ITS

; ((ITS))
IFL F.TENX,<
	SEARCH SITS
	LOC 150

	OPDEF THUD [.LOSE 1000]

;  Initialization routine, since have to load with DEC LOADER/LINK-10
; under DECUUO.  First load using DEC loader, flush DECUUO with 45$G
; and then D system command, then do INIT$G(or 150$G if no symbols).

INIT:	MOVSI (JUMPA)
	HRR .JBSA##
	.BREAK 12,[400001,,]		;set start address
	SETZ 1,
	MOVE [1,,2]
	BLT 150
	.BREAK 16,100000		;return to DDT
	JRST DFTP

; I/O Channels

	TTI==1		; TTY I/O
	TTO==2
	DCI==3		; Datalanguage I/O
	DCO==4
	ICP==5		; ICP channel
	DDI==6		; Data I/O
	DDO==7
	LCI==10		; Local input
	LCO==11		; Local output
 
; ITS network definitions

%NSCLS==0
%NSLSN==1
%NSRFC==2
%NSRCL==3
%NSRFS==4
%NSOPN==5
%NSRFN==6
%NSCLW==7
%NSCLI==10
%NSINP==11

DEFINE TBIN(REG)
<	.IOT TTI,REG
	CAIN REG,15
	 MOVEI REG,12
	CAIG REG,"z"
	 CAIGE REG,"a"
	  CAIA
	   TRZ REG," "
>;TBIN

OPDEF TBOUT [.IOT TTO,]


DEFINE TSOUT(STRING)
<	IRP STRING
<	MOVEI X1,STRING
	CALLR $STRIN
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$STRIN:	BEGINR
	HRLI X1,(POINT 7,)		; build a byte pointer
$STRI1:	ILDB X1				; get a character from string
	JUMPE RETN(0)			; quit when done
	.IOT TTO,			; output the character
	JRST $STRI1
	ENDR

DEFINE DCBIN(REG)
<	.IOT DCI,REG
	JUMPLE REG,QUIT2
	SKIPE FLAGDD
	 .IOT TTO,REG
>

OPDEF DCBOUT [.IOT DCO,]

DEFINE DCSOUT(STRING)
<	IRP STRING
<	MOVEI X1,STRING
	CALLR $DSTRI
>>

;  Routine to output an ASCIZ string under ITS because cretinous MACRO cannot
; return a character count for SIOT.

$DSTRI:	BEGINR
	HRLI X1,440700			; build a byte pointer
$DSTR1:	ILDB X1				; get a character from string
	JUMPE RETN(0)			; quit when done
	.IOT DCO,			; output the character
	SKIPE FLAGDD			; show DATALANGUAGE?
	 .IOT TTO,
	JRST $DSTR1			; and loop for more
	ENDR
>
; (((↑↑↑)))
	SUBTTL System Dependent Definitions for TOPS-10

; (((TOPS-10)))
IFE F.TENX,<
	TWOSEG
	RELOC	400000

	OPDEF THUD [JSP FLAG,OOPS]

IFN F.SAIL,<
IFNDEF TTCALL,<OPDEF TTCALL [TTYUUO]>
IFNDEF DSKPPN,<OPDEF DSKPPN [CALLI 400071]>
IFNDEF BEEP,<OPDEF BEEP [CALLI 400111]>
>
IFNDEF INCHRW,<OPDEF INCHRW [TTCALL 0,]>
IFNDEF OUTCHR,<OPDEF OUTCHR [TTCALL 1,]>
IFNDEF OUTSTR,<OPDEF OUTSTR [TTCALL 3,]>
IFN F.CMU,<
IFNDEF CMUDEC,<OPDEF CMUDEC [CALLI 777776]>
IFNDEF DECCMU,<OPDEF DECCMU [CALLI 777775]>
>

	DCCHAN==1
	DDCHAN==2
	LFCHAN==3
	LDCHAN==4

; DEFINITIONS FROM "IMP.MAC"
	.IBDEV==0
	.IBSTT==1
	.IBERR==1
	.IBLCL==2
	.IBHST==3
	.IBRMT==4
	.IUSTT==0
	.IUCON==3
	.IUCLS==4
	.IULSN==5
	.IULHS==15
	.IESOF==5
	.IESKT==11
	.IEDWN==13
	.IETIM==15

DEFINE	TBIN(REG)
<	INCHRW	REG
	TRZE REG,200
	 ANDI REG,37
	CAIE REG,175
	 CAIN REG,176
	  MOVEI REG,33
	CAIL	REG,"A"+40
	 CAILE	REG,"Z"+40
	  CAIA
	   SUBI	REG,40
>;TBIN
IFE F.SAIL,<
OPDEF TBOUT [OUTCHR]
>
IFN F.SAIL,<
DEFINE TBOUT(REG)
<	CAIN REG,7
	 JRST [	MOVNI REG,1
		BEEP REG,
		JRST .+2]
	OUTCHR REG
>;TBOUT
>
DEFINE	TSOUT(STRING)
<	IRP STRING,<
	OUTSTR	STRING
>;IRP STRING
>;TSOUT

DEFINE	DCBIN(REG)
<	SOSGE DCIBUF+2
	 JRST [	CALLR NUTMI
		JRST .-1]
	ILDB REG,DCIBUF+1
	JUMPE REG,.-3
>;DCIBIN
DEFINE	DCBOUT(REG)
<	IDPB	REG,DCOBUF+1
	OUT	DCCHAN,
	 CAIA
	  JRST	NETEOT>
DEFINE	DCSOUT(STRING)
<	IRP STRING
<	HRRZI	X1,STRING
	CALLR	NUTMO>
	OUT	DCCHAN,
	 CAIA
	  JRST	NETEOT>
>
; (((↑↑↑)))
	SUBTTL System Dependent Definitions for TENEX

; (((TENEX)))
IFG F.TENX,<
	SEARCH	STENEX

	THUD==-1

DEFINE	TBIN(REG)
<	PBIN
	CAIL	X1,"A"+40
	 CAILE	X1,"Z"+40
	  CAIA
	   SUBI	X1,40
	IFN <X1-REG>,< HRRZI REG,(X1)>
>;TBIN
DEFINE	TBOUT(REG)
<	IFN	<X1-REG>,< HRRZI	X1,(REG)>
	PBOUT>
DEFINE	TSOUT(STRING)
<	IRP STRING
<	HRROI	X1,STRING
	PSOUT>>

DEFINE	DCBIN(REG)
<	MOVE	X1,DCIJFN
	BIN
	SKIPN	FLAGDD
	 JRST	.+3
	HRRZI	X1,(X2)
	PBOUT
	HRRZI	REG,(X2)>
DEFINE	DCBOUT(REG)
<	MOVE	X1,DCOJFN
	HRRZI	X2,(REG)
	BOUT
	MOVEI	X2,21
	MTOPR>
DEFINE	DCSOUT(STRING)
<	..IDX==1
	IRP STRING<..IDX==..IDX+2>
	SKIPN	FLAGDD
	 JRST	.+..IDX
	IRP STRING
<	HRROI	X1,STRING
	PSOUT>
	MOVE	X1,DCOJFN
	SETZ	X3,
	IRP STRING
<	HRROI	X2,STRING
	SOUT>
	MOVEI	X2,21
	MTOPR>
>
; (((↑↑↑)))
	SUBTTL Main Program

DFTP:
IFE F.TENX,<JFCL>
IFGE F.TENX,<RESET>
	MOVE STAK,[IOWD STSIZ,STBEG]	; load PDP
	CALLR S$INIT			; do system-dependant init
	CALLR D$INIT			; do DC init

; (((PCAP UNRESTRICTED)))
IFE F.PCAP,<
IFL F.TENX,<			; HACK FOR ITS VERSION FOR AUTOENABLE
	MOVEI UTIL,CMDM3
	.OPEN ['DSK'
	       SIXBIT/←DFTP←/
	       SIXBIT/ENABLE/]
>
	 MOVEI UTIL,CMDM2	; CAN ENABLE LATER ON
>
; (((↑↑↑)))
; (((PCAP RESTRICTED))))
IFN F.PCAP,<
;	(((ITS)))
	IFL F.TENX,<
		MOVEI UTIL,CMDM2
		.SUSET [.RXUNAME,,X1]
		.CALL [	SETZ
			SIXBIT/OPEN/
			MOVEI
			[('DSK')]
			['.FILE.']
			['(DIR) ']
			SETZ X1]
		MOVEI UTIL,CMDM1	; NO ITS DIRECTORY
>
;	(((↑↑↑)))
;	(((TOPS-10)))
	IFE F.TENX,<
		MOVEI	UTIL,CMDM1
;		(!DISABLE!)
>
;	(((↑↑↑)))
;	(((TENEX)))
	IFG F.TENX,<
		MOVEI	UTIL,CMDM1
		MOVEI	X1,400000	; FOR THIS FORK
		RPCAP
		TRNE	X2,600000	; (1B18+1B19) WHEEL OR OPER
		 MOVEI	UTIL,CMDM2
>
;	(((↑↑↑)))
>
; (((↑↑↑)))
IFL F.TENX,<.CLOSE>
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD
RENTER:	MOVE	STAK,[IOWD STSIZ,STBEG]
CMDNEW:	TSOUT	<CRLF>
CMDCMD:	JRST	@CMDMOD
CMDM1:	TSOUT	<[ASCIZ/*/]>
	TCIN	(CMDMC1,[ASCIZ/*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM2:	TSOUT	<[ASCIZ/*/]>
	TCIN	(CMDMC2,[ASCIZ/*/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
CMDM3:	TSOUT	<[ASCIZ/!/]>
	TCIN	(CMDMC3,[ASCIZ/!/])
	 JRST	CMDCMD
	 JRST	CMDNEW
	JRST	(FLAG)
	SUBTTL Terminal Input Dispatch Tables

DEFINE TCIL <
IFG ..MODE-2,<	TCIE ALLOCATE,CALO >
		TCIE ATTACH,CATT
		TCIE BIG,CBIG
IFG ..MODE-2,<	TCIE CHANGE,CCHA >
		TCIE CONNECT,CCON
IFG ..MODE-2,<	TCIE CREATE,CCRE >
		TCIE DELETE,CDEL
		TCIE DIRECTORY,CDIR
IFG ..MODE-2,<	TCIE DISABLE,CDIS >
IFE ..MODE-2,<	TCIE ENABLE,CENA >
		TCIE EXAMINE,CEXA
IFG F.TENX,<	TCIE EXEC,CEXE >		;TENEX only
		TCIE EXPUNGE,CEXP
		TCIE GET,CGET
IFG ..MODE-2,<	TCIE LINK,CLIN >
		TCIE LIST,CLIS
IFL F.TENX,<	TCIE LOCAL-CONNECT,CLOC >	;ITS only
IFE F.TENX,<	TCIE LOCAL-DIRECTORY,CLOD >	;TOPS-10 only
IFE F.TENX,<	TCIE LOCAL-STRUCTURE,CLOS >	;TOPS-10 only
IFE F.TENX,<	TCIE LOCAL-USER,CLOU >		;TOPS-10 only
		TCIE NO-DATALANGUAGE,CNOD
		TCIE PUT,CPUT
		TCIE QUIT,CQUI
		TCIE REMOVE,CREM
		TCIE RENUMBER,CREN
		TCIE RETRIEVE,CRET
		TCIE SHOW-DATALANGUAGE,CSOD
		TCIE STORE,CSTO
IFL F.TENX,<	TCIE TERSE,CTER >		;ITS only
		TCIE TIME-TRANSFERS,CTTR
IFL F.TENX,<
 IFG ..MODE-2,<	TCIE TOP-LEVEL,CTOP >>
		TCIE UNDELETE,CUND
		TCIE UNTIME-TRANSFERS,CUTR
IFL F.TENX,<	TCIE VERBOSE,CVER >		;ITS only
>;TCIL

CMDMC1:	..MODE==1
	XTCIL
CMDMC2:	..MODE==2
	XTCIL
CMDMC3:	..MODE==3
	XTCIL
	SUBTTL Top level commands

CALO:	PATH	([ASCIZ/ ALLOCATE /],PATHNR!PATHCA)
	 JRST	CMDCMD
	TSOUT	<[ASCIZ/ Megabits: /]>
CALO1:	TNIN	([ASCIZ/ Megabits: /])
	 JRST	CMDCMD
	JUMPN	IO,CALO2
	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	CALO1
CALO2:	MOVEM	IO,ABUF
	TSOUT	<CRLF>
	CALLR	DALO
	JRST	CMDCMD

CATT:	PATH	([ASCIZ/ ATTACH /],PATHNR!PATHCT)
	 JRST	CMDCMD
	CALLR	DATT
	JRST	CMDCMD

CBIG:	PATH	([ASCIZ/ BIG /],PATHNR!PATHCA)
	 JRST	CMDCMD
	CALLR	DBIG
	JRST	CMDCMD

CCHA:	PATH	([ASCIZ/ CHANGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST	CMDCMD
	CALLR	DCHA
	JRST	CMDCMD

CCON:	PATH	([ASCIZ/ CONNECT /],PATHNR!PATHCA!PATHAD)
	 JRST	CMDCMD
	CALLR	DCON
	JRST	CMDCMD

CCRE:	PATH	([ASCIZ/ CREATE /],PATHNR!PATHCA)
	 JRST	CMDCMD
	CALLR	DCRE
	JRST	CMDCMD

CDEL:	PATH	([ASCIZ/ DELETE /],PATHNP!PATHFR!PATHAS!PATHAC!PATHAV)
	 JRST	CMDCMD
	CALLR	DDEL
	JRST	CMDCMD

CDIR:	PATH	([ASCIZ/ DIRECTORY /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	MOVE	IO,CMDMOD
	CAIN	IO,CMDM3
	 JRST	CDIR1
	TSOUT	<[ASCIZ/**/]>
	TCIN	(CDIRC,[ASCIZ/**/])
	 JRST	CMDCMD
	 JRST	CDIR2
	JRST	CDIR3
CDIR1:	TSOUT	<[ASCIZ/!!/]>
	TCIN	(CDIRC,[ASCIZ/!!/])
	 JRST	CMDCMD
	 JRST	CDIR2
	JRST	CDIR3
CDIR2:	MOVEI	FLAG,DD$T
	TSOUT	<[ASCIZ/TERSE/]>
CDIR3:	TSOUT	<CRLF>
	CALLR	DDIR
	JRST	CMDCMD

CDIRC:
DEFINE TCIL <
	TCIE DELETED,DD$D
	TCIE TERSE,DD$T
	TCIE VERBOSE,DD$V
>;TCIL
	XTCIL

CDIS:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM2
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

CENA:	TSOUT	<CRLF>
	MOVEI	UTIL,CMDM3
	MOVEM	UTIL,CMDMOD
	JRST	CMDCMD

CEXA:	PATH	([ASCIZ/ EXAMINE /],PATHNP!PATHFR!PATHAV!PATHAS)
	 JRST	CMDCMD
	TSOUT	<[ASCIZ/ Lines per page: /]>
	TNIN	([ASCIZ/ Lines per page: /])
	 JRST	CMDCMD
	JUMPN	IO,CEXA0
	SKIPN	IO,DEXA$P
	 MOVEI	IO,↑D20
	TNOUT	<IO>
CEXA0:	MOVEM	IO,DEXA$P
	TSOUT	<CRLF>
	MOVE	UTIL,VBUF
	LDB	IO,[350700,,FBUF]
	CAIN	IO,"*"
	 SETO	UTIL,
	LDB	IO,[350700,,EBUF]
	CAIN	IO,"*"
	 SETO	UTIL,
	MOVEM	UTIL,DEXA$S
	CALLR	DEXA
	 JRST	CMDCMD
	JRST	CMDCMD

; (((TENEX)))
IFG F.TENX,<
CEXE:	HRROI	X1,CRLF
	PSOUT
	HRLZI	X1,(1B1)	; INFERIOR GETS THIS FORK'S CAPABILITIES
	CFORK			; CREATE FORK
	 JRST	CMDCMD		;  Maybe inferior should not get LOG
	HRLI	UTIL,(X1)	; capability?  Seems like a win - MRC
	HRLZI	X1,(1B2+1B17)
	SKIPE FLAG20
	 SKIPA X2,[-1,,[ASCIZ/<SYSTEM>EXEC.EXE/]]	; Twenex
	  HRROI X2,[ASCIZ/<SYSTEM>EXEC.SAV/]		; Tenex
	GTJFN
	 JRST	CEXE0
	HRRI	UTIL,(X1)
	HRRZI	X1,-1
	RFMOD
	MOVE	R10,X2
	SKIPN	FLAG20
	 JRST	CEXE1
	TRO	X2,004000
	SFMOD
CEXE1:	RFCOC
	MOVE	R11,X2
	MOVE	R12,X3
	MOVE	X1,UTIL
	GET			; LOAD EXEC INTO FORK
	HLR	X1,UTIL
	SETZ	X2,
	SFRKV			; START FORK AT MAIN STARTUP
	WFORK
	HRRZI	X1,-1
	MOVE	X2,R10
	SFMOD
	MOVE	X2,R11
	MOVE	X3,R12
	SFCOC
CEXE0:	HLR	X1,UTIL
	KFORK
	JRST	CMDCMD
>
; (((↑↑↑)))

CEXP:	PATH	([ASCIZ/ EXPUNGE /],PATHNR!PATHCC!PATHAD!PATHAC)
	 JRST	CMDCMD
	CALLR	DEXP
	JRST	CMDCMD

CGET:	PATH	([ASCIZ/ GET /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD

CLIN:	TSOUT	<CRLF>
	CALLR	DLIN
	JRST	CMDCMD

CLIS:	PATH	([ASCIZ/ LIST /],PATHNR!PATHCC!PATHAS)
	 JRST	CMDCMD
	MOVE	IO,CMDMOD
	CAIN	IO,CMDM3
	 JRST	CLIS1
	TSOUT	<[ASCIZ/**/]>
	TCIN	(CLISC1,[ASCIZ/**/])
	 JRST	CMDCMD
	 JRST	CLIS2
	JRST	CLIS3
CLIS1:	TSOUT	<[ASCIZ/!!/]>
	TCIN	(CLISC2,[ASCIZ/!!/])
	 JRST	CMDCMD
	 JRST	CLIS2
	JRST	CLIS3
CLIS2:	MOVEI	FLAG,DL$T
	TSOUT	<[ASCIZ/TERSE/]>
CLIS3:	TSOUT	<CRLF>
	CALLR	DLIS
	JRST	CMDCMD

CLISC1:
DEFINE TCIL <
	TCIE TERSE,DL$T
	TCIE VERBOSE,DL$V
>;TCIL
	XTCIL
CLISC2:
DEFINE TCIL <
	TCIE PROTECTION,DL$P
	TCIE TERSE,DL$T
	TCIE VERBOSE,DL$V
>;TCIL
	XTCIL
; (((ITS)))
IFL F.TENX,<
CLOC:	TBOUT [" "]
	MOVE IO,[ABUF,,6]
	HRRZI UTIL,[ASCIZ/ LOCAL-CONNECT /]
	CALLR $TSIN$
	 JRST CMDCMD
	JUMPE UTIL,[	.SUSET [.RSNAME,,LCLSNM]
			TSOUT <[ASCIZ/(default)/],CRLF>
			JRST CMDCMD]
	TSOUT <CRLF>
	SETZM LCLSNM
	MOVE X1,[440600,,LCLSNM]
	MOVE X2,[440700,,ABUF]
CLOCLP:	ILDB X2
	SUBI " "
	IDPB X1
	SOJG UTIL,CLOCLP
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVEI
		[('DSK')]
		['.FILE.']
		['(DIR) ']
		SETZ LCLSNM]
	 JRST [	TSOUT <[ASCIZ/ (No such directory)/],CRLF,[ASCIZ/ LOCAL-CONNECT/]>
		JRST CLOC]
	.CLOSE
	JRST CMDCMD
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
CLOD:	TSOUT	<CRLF>
	SETZM	LUTDSP
CLOD1:	CALLR	LUTDS
	 JRST	CMDCMD
	TSOUT	<[ASCIZ/ /],LUTDSF,CRLF>
	JRST	CLOD1

CLOS:	MOVEI	IO," "
	TBOUT	IO
	TSIN	(UBUF2,SBSIZE,[ASCIZ/ LOCAL-STRUCTURE /])
	 JRST	CMDCMD
	JUMPE	UTIL,[	MOVE BP,[ASCIZ/DSK/]
			MOVEM BP,UBUF2
			TSOUT <UBUF2>
			JRST .+1]
	TSOUT	<CRLF>
	MOVE	BP,[440700,,UBUF2]
CLOS1:	ILDB	IO,BP
	JUMPE	IO,CLOS2
	CAIE	IO,":"
	 JRST	CLOS1
	SETZ	IO,
	DPB	IO,BP
CLOS2:	HRRZI	IO,UBUF2
	CALLR	LUTFN
	MOVE	IO,LFILE
	DEVCHR	IO,
	TLNE	IO,200000
	 JRST	CLOS3
	OUTSTR	[ASCIZ/ (Local structure must be a disk)
/]
	JRST	CMDCMD
CLOS3:	MOVE	IO,LFILE
	MOVEM	IO,LFCHAS+1
	JRST	CMDCMD
CLOU:
IFE F.CMU,<
	OUTSTR	[ASCIZ/
 Project: /]
IFE F.SAIL,<
	TNIN	([ASCIZ/ Project: /],10)
	 JRST	CMDCMD
>;IFE F.SAIL
IFN F.SAIL,<
	MOVE IO,[ABUF,,3]	; do not use TSIN macro!!  - MRC
	HRRZI UTIL,[ASCIZ/ Project:/]
	CALLR $TSIN$
	 JRST CMDCMD
	SETZ IO,
	MOVE X1,[440700,,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU1A
	LSH IO,6
	ADDI IO,-" "(X2)
>;REPEAT 3
>;IFN F.SAIL
CLOU1A:	HRLZI UTIL,(IO)
	JUMPN IO,CLOU1
IFN F.SAIL,<
	SETZ IO,
	DSKPPN IO,>
IFE F.SAIL,<GETPPN IO,>
	 JFCL
	HLLZ UTIL,IO
	OUTSTR [ASCIZ/(self)/]
CLOU1:	OUTSTR	[ASCIZ/
 Programmer: /]
IFE F.SAIL,<
	TNIN	([ASCIZ/ Programmer: /],10)
	 JRST	CMDCMD
>;IFE F.SAIL
IFN F.SAIL,<
	PUSH STAK,UTIL
	MOVE IO,[ABUF,,3]	; do not use TSIN macro!!  - MRC
	HRRZI UTIL,[ASCIZ/ Programmer:/]
	CALLR $TSIN$
	 JRST [	POP STAK,UTIL
		JRST CMDCMD]
	SETZ IO,
	POP STAK,UTIL
	MOVE X1,[440700,,ABUF]
REPEAT 3,<
	ILDB X2,X1
	JUMPE X2,CLOU2A
	LSH IO,6
	ADDI IO,-" "(X2)
>;REPEAT 3
>;IFN F.SAIL
CLOU2A:	HRRI	UTIL,(IO)
	JUMPN	IO,CLOU2
IFN F.SAIL,<SETZ IO,
	DSKPPN IO,>
IFE F.SAIL,<GETPPN IO,>
	 JFCL
	HRR UTIL,IO
	OUTSTR [ASCIZ/(self)/]
>;IFE F.CMU
IFN F.CMU,<
	TSIN (ABUF,4,[ASCIZ/ LOCAL-USER /])
	 JRST CMDCMD
	MOVE IO,[UTIL,,ABUF]
	JUMPE UTIL,[	GETPPN UTIL,	; this instead of (self)
			 JFCL
			DECCMU IO,
			 JRST [	OUTSTR [ASCIZ/(self)/]	; chomp!
				JRST CLOU2]
			OUTSTR ABUF
			JRST CLOU2]
	CMUDEC IO,
	 JRST CLOU4
>;IFN F.CMU
CLOU2:	TSOUT	<CRLF>
	RELEAS	LDCHAN,
	MOVEM	UTIL,LDIR
	MOVE	IO,[SIXBIT/UFD/]
	MOVEM	IO,LDIR+1
	SETZM	LDIR+2
IFE F.SAIL,<MOVE IO,[1,,1]>
IFN F.SAIL,<MOVE IO,[SIXBIT/  1  1/]>
	MOVEM	IO,LDIR+3
	MOVE	IO,LFCHAS+1
	MOVEM	IO,LDCHAS+1
	OPEN	LDCHAN,LDCHAS
	 JRST	CLOU4
	LOOKUP	LDCHAN,LDIR
	 JRST	CLOU4
	RELEAS	LDCHAN,
	MOVEM	UTIL,LFIPPN
	JRST	CMDCMD
CLOU4:	OUTSTR	[ASCIZ/ (No such directory)
/]
	JRST	CMDCMD
>
; (((↑↑↑)))
CNOD:	SETZM	FLAGDD
	JRST	CMDNEW

CPUT:	PATH	([ASCIZ/ PUT /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CQUI:	TAIN	<[ASCIZ/ [Confirm]/]>
	 JRST	CMDCMD
	 JRST	CMDCMD
	JRST	QUIT

CREM:	PATH	([ASCIZ/ REMOVE /],PATHNR!PATHCC!PATHAS!PATHAC)
	 JRST	CMDCMD
	CALLR	DREM
	JRST	CMDCMD

CREN:	PATH	([ASCIZ/ RENUMBER /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	SKIPLE	X1,VBUF
	 JRST	CREN2
	JUMPL	X1,CREN1
	LDB	UTIL,[350700,,FBUF]
	CAIN	UTIL,"*"
	 JRST	CREN1
	LDB	UTIL,[350700,,EBUF]
	CAIE	UTIL,"*"
	 JRST	CREN2
CREN1:	TSOUT	<[ASCIZ/ (A version number is required if *'s are used.)/],CRLF>
	JRST	CMDCMD
CREN2:	TSOUT	<[ASCIZ/ New version number: /]>
	TNIN	([ASCIZ/ New version number: /])
	 JRST	CMDCMD
	JUMPN	IO,CREN3
	MOVEI	IO,"1"
	TBOUT	<IO>
	MOVEI	IO,1
CREN3:	MOVEM	IO,ABUF
	TSOUT	<CRLF>
	CALLR	DREN
	JRST	CMDCMD

CRET:	PATH	([ASCIZ/ RETRIEVE /],PATHNP!PATHFR!PATHRL!PATHAV!PATHAS)
	 JRST	CMDCMD
	CALLR	DGET
	 JRST	CMDCMD
	JRST	CMDCMD
CSOD:	SETOM	FLAGDD
	JRST	CMDNEW

CSTO:	PATH	([ASCIZ/ STORE /],PATHNP!PATHFR!PATHLR!PATHAS)
	 JRST	CMDCMD
	CALLR	DPUT
	 JRST	CMDCMD
	JRST	CMDCMD

CTER:	SETOM FLAGNN
	SETZM FLAGDD
	SETZM FLAGTT
	JRST CMDNEW

CTTR:	SETOM	FLAGTT
	JRST	CMDNEW

IFL F.TENX,<
CTOP:	TAIN <[ASCIZ/ [Confirm]/]>
	 JRST CMDCMD
	 JRST CMDCMD
	MOVE X1,[ASCII/%TOP./]
	MOVEM X1,NBUF
	MOVE X1,[ASCII/DFTP./]
	MOVEM X1,NBUF+1
	MOVE X1,[ASCII/ITS('/]
	MOVEM X1,NBUF+2
	MOVE X1,[ASCII/CONS'/]
	MOVEM X1,NBUF+3
	MOVE X1,[ASCII/)/]
	MOVEM X1,NBUF+4
	CALLR DATT
	JRST CMDCMD
>

CUND:	PATH	([ASCIZ/ UNDELETE /],PATHNP!PATHFR!PATHAS!PATHAV)
	 JRST	CMDCMD
	CALLR	DUND
	JRST	CMDCMD

CUTR:	SETZM	FLAGTT
	JRST	CMDNEW

CVER:	SETZM FLAGNN
	JRST CMDNEW
	SUBTTL Path input and translation
PRINTX (path input routines)

; FLAG DEFINITIONS
	PATHNR==400000		; NODE REQUIRED
	PATHNP==200000		; NODE POSSIBLE
	PATHNF==100000		; NODE FOUND
	PATHFR==040000		; FILE REQUIRED
	PATHFF==020000		; FILE FOUND
	PATHCT==004000		; CONTEXT TOP
	PATHCA==002000		; CONTEXT ATTACH
	PATHCC==001000		; CONTEXT CONNECT
	PATHLR==000400		; LOCAL TO REMOTE
	PATHRL==000200		; REMOTE TO LOCAL
	PATHAS==000040		; ALLOW SETS
	PATHAD==000020		; ALLOW (NON-SET) DEFAULT
	PATHAV==000010		; ALLOW VERSIONS
	PATHAC==000004		; ACKNOWLEDGE [CONFIRM]

; PATH INPUT CONTROL
;   IN: TCIO -- LAST CHARACTER INPUT (TCIN)
;	FLAG -- FLAGS,,COMMAND STRING POINTER
;
$PATH$:	BEGINR	<IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
	TLNE	FLAG,PATHLR
	 TLO	FLAG,PATHAV
>
; (((↑↑↑)))
	MOVEI	IO," "
	TBOUT	<IO>
	MOVE	IO,[GBUF1,,5*LBSIZE]
	SETZ	UTIL,
	CALLR	P$IN
	 RETURN
	PUSH	STAK,IO
	MOVE	IO,[GBUF1,,NBUF]
	MOVE	UTIL,[FBUF,,EBUF]
	CALLR	P$PP
	POP	STAK,IO
	MOVEM	UTIL,VBUF
	TLNN	FLAG,PATHAC
	 JRST	PAT$10
	TAIN	<[ASCIZ/ [Confirm]/]>
	 RETURN
	 RETURN
	RETURN	SKIP,1
PAT$10:	TLNE	FLAG,PATHRL!PATHLR
	 JRST	PAT$11
	TSOUT	<CRLF>
	RETURN	SKIP,1
PAT$11:	PUSH	STAK,IO
	MOVE	IO,[FBUF,,EBUF]
; (((TENEX)))
IFG F.TENX,<
	TLNE	FLAG,PATHRL
	 SETZ	UTIL,
>
; (((↑↑↑)))
	CALLR	P$LF
	POP	STAK,IO
	CAIE	IO,33
	 CAIN	IO,"λ"
	  JRST	PAT$20
; (((TOPS-10+ITS)))
IFLE F.TENX,<
PAT$12:	TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
PAT$12:	SKIPE	LJFN
	 JRST	PAT$13
	HRROI	X1,CRLF
	PSOUT
PAT$13:
>
; (((↑↑↑)))
	RETURN	SKIP,1
PAT$20:	TLNE	FLAG,PATHLR
	 JRST	PAT$21
	TLNE	FLAG,PATHRL
	 JRST	PAT$22
	JRST	PAT$23
PAT$21:	TLNE	FLAG,PATHNF
	 JRST	PAT$12
; (((TENEX)))
IFG F.TENX,<
	TLZ	FLAG,PATHAV
>
; (((↑↑↑)))
	JRST	PAT$23
PAT$22:
; (((TOPS-10+ITS)))
IFLE F.TENX,<
	TLZ	FLAG,PATHNR!PATHNP!PATHAV
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	SKIPN	LJFN
	 JRST	PAT$26
	HRROI	X1,CRLF
	PSOUT
	RETURN	SKIP,1
PAT$26:	TLZ	FLAG,PATHNR!PATHNP
>
; (((↑↑↑)))
PAT$23:	TSOUT	<[ASCIZ/ [As] /]>
	MOVE	IO,[GBUF2,,5*LBSIZE]
	MOVE	UTIL,[GBUF1,,[ASCIZ/ [As] /]]
	CALLR	P$IN
	 RETURN
	TLNE	FLAG,PATHLR
	 JRST	PAT$24
	TLNE	FLAG,PATHRL
	 JRST	PAT$25
	RETURN
PAT$24:	MOVE	IO,[GBUF2,,NBUF]
	MOVE	UTIL,[FBUF,,EBUF]
	CALLR	P$PP
	MOVEM	UTIL,VBUF
	TSOUT	<CRLF>
	RETURN	SKIP,1
PAT$25:	MOVE	IO,[GBUF2,,GBUF1]
	MOVE	UTIL,[FSBUF,,ESBUF]
	CALLR	P$PP
	MOVE	IO,[FSBUF,,ESBUF]
	CALLR	P$LF
; (((TOPS-10+ITS)))
IFLE F.TENX,<
	TSOUT <CRLF>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	SKIPE	LJFN
	 JRST	PAT$27
	HRROI	X1,CRLF
	PSOUT
PAT$27:
>
; (((↑↑↑)))
	ENDR	SKIP,1
; PATH INPUT
;   IN: IO -- POINTER TO PATH BUFFER,,SIZE OF PATH BUFFER
;       UTIL -- FIRST PATH,,TIE MSG (OR ZERO)
;       FLAG -- (SAME AS $PATH$)
;   OUT: IO -- LAST CHARACTER INPUT
;        UTIL -- COUNT OF CHARACTERS
;   FLAGS:
	P$I$AE==400000		; ANCHOR ENCOUNTERED (<)
	P$I$DE==200000		; DESCENDER ENCOUNTERED (>,.)
	P$I$SE==100000		; SET ENCOUNTERED (*)
	P$I$TE==040000		; TRAILING NODE SET ENCOUNTERED (**)
	P$I$PW==010000		; INPUT PASSWORD
	P$I$CC==004000		; <
	P$I$CA==002000		; <<
	P$I$CT==001000		; <<<
	P$I$EP==000400		; EXTENSION BEING PROCESSED
	P$I$VP==000200		; VERSION BEING PROCESSED
;
P$IN:	BEGINR	<BP,R10,R11,R12,R13>
	SETZ	R10,
	MOVE	R11,IO
	MOVE	R12,UTIL
	HLR	BP,IO
	HRLI	BP,440700
	SETZ	UTIL,
P$ICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	P$IREP
	CAIE	IO,177
	 CAIN	IO,"A"-100
	  JRST	P$IDEL
	CAIE	IO,"U"-100
	 CAIN	IO,"X"-100
	  JRST	P$IENR
	CAIN	IO,15
	 JRST	P$ICHR
	CAIE	IO,12
	 CAIN	IO,33
	  JRST	P$IEND
	CAIN	IO,37
	 JRST	P$IEND
	CAIL	IO," "
	 CAIN	IO,42
	  JRST	P$IBAD
	CAIE	IO,47
	 TRNE	R10,P$I$TE
	  JRST	P$IBAD
	CAIL	UTIL,(R11)
	 JRST	P$IBAD
	TRNE	R10,P$I$PW
	 JRST	P$ICHP
	CAIN	IO," "
	 JRST	P$IEND
	CAIN	IO,"?"
	 JRST	P$IBAD
	CAIN	IO,"*"
	 JRST	P$ISS
	TRNE	R10,P$I$VP
	 JRST	P$ISVN
	CAIN	IO,";"
	 JRST	P$ISVS
	CAIN	IO,":"
	 JRST	P$IPON
	CAIN	IO,"<"
	 JRST	P$ISA
	CAIN	IO,">"
	 JRST	P$ISD1
	CAIN	IO,"."
	 JRST	P$ISD2
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TRZ	R10,P$I$AE!P$I$DE
P$ICHE:	IDPB	IO,BP
	TBOUT	<IO>
	AOJA	UTIL,P$ICHR
P$ICHP:	CAIN	IO,">"
	 JRST	P$IPOF
	CAIN	IO,"'"
	 JRST	P$IBAD
	IDPB	IO,BP
	AOJA	UTIL,P$ICHR
P$ISA:	TLNN	FLAG,PATHNR!PATHNP
	 JRST	P$IBAD
	TRNN	R10,P$I$CC
	 JRST	P$ISA1
	TRNN	R10,P$I$CA
	 JRST	P$ISA2
	TRNN	R10,P$I$CT
	 JRST	P$ISA3
	JRST	P$IBAD
P$ISA1:	JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$AE!P$I$CC
	JRST	P$ICHE
P$ISA2:	CAIE	UTIL,1
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CA
	JRST	P$ICHE
P$ISA3:	CAIE	UTIL,2
	 JRST	P$IBAD
	TRO	R10,P$I$AE!P$I$CT
	JRST	P$ICHE
P$ISD1:	TLNE	FLAG,PATHNR!PATHNP
	 TRNE	R10,P$I$AE!P$I$EP
	  JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TLNE	FLAG,PATHFR
	 TRNN	R10,P$I$SE
	  TROE	R10,P$I$DE
	   JRST	P$IBAD
	JRST	P$ISD9
P$ISD2:	TLNE	FLAG,PATHFR
	 TRNE	R10,P$I$AE!P$I$DE!P$I$EP
	  JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRO	R10,P$I$DE!P$I$EP
P$ISD9:	TRZ	R10,P$I$SE
	JRST	P$ICHE
P$ISVS:	TLNE	FLAG,PATHAV
	 TLNN	FLAG,PATHFR
	  JRST	P$IBAD
	JUMPE	UTIL,P$IBAD
	TRNE	R10,P$I$DE
	 TRNE	R10,P$I$EP
	  TRNE	R10,P$I$AE!P$I$VP
	   JRST	P$IBAD
	TRZ	R10,P$I$SE!P$I$EP
	TRO	R10,P$I$VP!P$I$DE
	JRST	P$ICHE
P$ISVN:	CAIL	IO,"0"
	 CAILE	IO,"9"
	  JRST	P$IBAD
	TRNE	R10,P$I$SE
	 JRST	P$IBAD
	TRZ	R10,P$I$DE
	JRST	P$ICHE
P$ISS:	TLNN	FLAG,PATHAS
	 JRST	P$IBAD
	TRNE	R10,P$I$SE
	 JRST	P$IST
	TRZN	R10,P$I$AE!P$I$DE
	 JUMPN	UTIL,P$IBAD
	TRO	R10,P$I$SE
	JRST	P$ICHE
P$IST:	TLNN	FLAG,PATHFR
	 TRNN	R10,P$I$EP!P$I$VP
	  JRST	P$IBAD
	TRO	R10,P$I$TE
	JRST	P$ICHE
P$IPON:	TLNE	FLAG,PATHNR!PATHNP
	 TRNE	R10,P$I$AE!P$I$DE!P$I$SE
	  JRST	P$IBAD
	CAIL	UTIL,-1(R11)
	 JRST	P$IBAD
	IDPB	IO,BP
	TBOUT	<IO>
	MOVEI	X1,"P"-100
	IDPB	X1,BP
	ADDI	UTIL,2
	TRO	R10,P$I$PW
	JRST	P$ICHR
P$IPOF:	CAIL	UTIL,-1(R11)
	 JRST	P$IBAD
	MOVEI	X1,"P"-100
	IDPB	X1,BP
	IDPB	IO,BP
	TBOUT	<IO>
	ADDI	UTIL,2
	TRZ	R10,P$I$PW
	TRO	R10,P$I$DE
	JRST	P$ICHR
P$IBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	P$ICHR
P$IREP:	TSOUT	<CRLF>
	TSOUT	<(FLAG)>
	JUMPE	R12,P$IR04
	HLR	R13,R12
	HRLI	R13,440700
	TRZ	R10,P$I$PW
P$IR01:	ILDB	IO,R13
	JUMPE	IO,P$IR03
	CAIN	IO,"P"-100
	 JRST	P$IR02
	TRNE	R10,P$I$PW
	 JRST	P$IR01
	TBOUT	<IO>
	JRST	P$IR01
P$IR02:	TRC	R10,P$I$PW
	JRST	P$IR01
P$IR03:	TSOUT	<(R12)>
P$IR04:	HRRZI	IO,(BP)
	HLR	R13,R11
	CAIGE	IO,(R13)
	 JRST	P$ICHR
	HRLI	R13,440700
	TRZ	R10,P$I$PW
P$IR05:	CAMN	R13,BP
	 JRST	P$ICHR
	ILDB	IO,R13
	CAIN	IO,"P"-100
	 JRST	P$IR06
	TRNE	R10,P$I$PW
	 JRST	P$IR05
	TBOUT	<IO>
	JRST	P$IR05
P$IR06:	TRC	R10,P$I$PW
	JRST	P$IR05
P$IDEL:	JUMPE	UTIL,P$IENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	CAIN	IO,"P"-100
	 JRST	P$ID01
	LDB	X1,BP
	CAIN	X1,"P"-100
	 JRST	P$ID02
	TRNE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TBOUT	<IO>
	TRZ	R10,P$I$AE!P$I$DE!P$I$SE!P$I$TE
	CAIN	IO,"."
	 TRZ	R10,P$I$EP
	CAIN	IO,";"
	 TRZ	R10,P$I$VP
	CAIE	IO,"<"
	 JRST	P$ID00
	TRZE	R10,P$I$CT
	 JRST	P$ID00
	TRZE	R10,P$I$CA
	 JRST	P$ID00
	TRZ	R10,P$I$CC
P$ID00:	SOJE	UTIL,P$ICHR
	LDB	X1,BP
	CAIN	X1,"<"
	 TRO	R10,P$I$AE
	CAIE	X1,">"
	 CAIN	X1,"."
	  TRO	R10,P$I$DE
	CAIN	X1,";"
	 TRO	R10,P$I$DE
	CAIN	X1,"*"
	 TRO	R10,P$I$SE
	JRST	P$ICHR
P$ID01:	TRZ	R10,P$I$PW
	LDB	IO,BP
	JRST	P$ID03
P$ID02:	TROE	R10,P$I$PW
	 SOJA	UTIL,P$ICHR
	TRZ	R10,P$I$DE
P$ID03:	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	TBOUT	<IO>
	SUBI	UTIL,2
	JRST	P$ICHR
P$IENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETO	IO,
	SETZ	UTIL,
	RETURN
P$IEND:	CAIE	IO,12
	 CAIN	IO,37
	  JRST	P$IENL
	TLNN	FLAG,PATHAS
	 JRST	P$IENV
	JUMPE	UTIL,P$IENV
	LDB	R13,BP
	CAIN	R13,">"
	 JRST	P$IENT
	TLNE	FLAG,PATHFR
	 TLNE	FLAG,PATHAS
	  JRST	P$IENV
	CAIA
P$IENL:	 TLNE	FLAG,PATHFR
	  TRNN	R10,P$I$AE
	   JRST P$IENV
	JRST	P$IBAD
P$IENV:	TRNE	R10,P$I$DE
	 TRNE	R10,P$I$EP
	  CAIA
	  JRST	P$IBAD
; (((TENEX)))
IFG F.TENX,<
	TLNE	FLAG,PATHFR
	 TLNN	FLAG,PATHLR!PATHRL
	  JRST	P$IE$6
	JUMPN	UTIL,P$IE$6
	TLNE	FLAG,PATHLR
	 JUMPN	R12,P$IBAD	; PUT -- SECOND ARGUMENT
	MOVEI	X1,76
	PBOUT
	SKIPN	FLAG20
	 JRST	P$IE$0
	HRRZI	X1,-1
	RFMOD
	TRO	X2,004000
	SFMOD
P$IE$0:	TLNE	FLAG,PATHLR
	 HRLZI	X1,160103	; OLD,MSG,CONFIRM,JFN,SHORT
	TLNE	FLAG,PATHRL
	 HRLZI	X1,660043	; OUTPUT,NEW,MSG,CONFIRM,JFN,SHORT
	MOVE	X2,[100,,101]
	GTJFN
	 SETZ	X1,
	MOVE	X4,X1
	SKIPN	FLAG20
	 JRST	P$IE$7
	HRRZI	X1,-1
	RFMOD
	TRZ	X2,006000
	SFMOD
P$IE$7:	JUMPE	X4,P$IENR
	MOVEI	X1,100
	BKJFN
	 THUD
	PBIN
	MOVEI	IO,(X1)
	HRRZI	X1,(X4)
	DVCHR
	TLNN	X2,000777
	 JRST	P$IE$1
	HRROI	X1,[ASCIZ/ (Device must be disk.)
/]
	PSOUT
	HRRZI	X1,(X4)
	RLJFN
	 JFCL
	SETO	IO,
	SETZ	UTIL,
	RETURN
P$IE$1:	JUMPN	R12,P$IE$2
	TLNE	FLAG,PATHRL
	 JRST	P$IE$8
	CAIE	IO,33
	 CAIN	IO," "
	  JRST	P$IE$2
P$IE$8:	HRROI	X1,UBUF2
	HRRZI	X2,(X4)
	MOVE	X3,[002200,,000001]
	JFNS
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 CAIA
	  JRST	P$IE$2
	HRROI	X1,[ASCIZ/ (Bad remote file name.)
/]
	PSOUT
	HRRZI	X1,(X4)
	RLJFN
	 JRST	.+1
	SETO	IO,
	SETZ	UTIL,
	RETURN
P$IE$2:	MOVE	X1,X4
	MOVEM	X1,LJFN
	HRROI	X1,LFILE
	MOVE	X2,LJFN
	SETZ	X3,
	JFNS
	HLRO	X1,R11
	MOVE	X2,LJFN
	MOVE	X3,[002200,,000001]
	JFNS
	LDB	X2,X1
	CAIE	X2,"."
	 JRST	P$IE$3
	SETZ	X2,
	DPB	X2,X1
P$IE$3:	HRROI	X1,FSBUF
	MOVE	X2,LJFN
	HRLZI	X3,002000
	JFNS
	LDB	X1,[350700,,FSBUF]
	CAIN	X1,"*"
	 SETOM	FSBUF
	HRROI	X1,ESBUF
	HRLZI	X3,000200
	JFNS
	LDB	X1,[350700,,ESBUF]
	CAIN	X1,"*"
	 SETOM	ESBUF
	CAIN	X1,0
	 SETZM	ESBUF
	TLNN	X2,017000
	 JRST	P$IE$4
	TLNE	X2,010000
	 SETOM	VSBUF
	TLNE	X2,007000
	 SETZM	VSBUF
	JRST	P$IE$5
P$IE$4:	HRROI	X1,UBUF1
	HRLZI	X3,000020
	JFNS
	HRROI	X1,UBUF1
	MOVEI	X3,↑D10
	NIN
	 SETZ	X2,
	MOVEM	X2,VSBUF
P$IE$5:	HRRZ	X1,LJFN
	RLJFN
	 THUD
	MOVEI	UTIL,-1(R11)
	CAIE	IO,12
	 CAIN	IO,37
	  SETOM	LJFN
	RETURN	SKIP,1
P$IE$6:	TLNE	FLAG,PATHLR
	 JUMPN	R12,P$IE$9
	SETZM	LFILE
	SETZM	LJFN
p$IE$9:
>
; (((↑↑↑)))
	JUMPN	UTIL,P$IENN
	TLNN	FLAG,PATHAS
	 JRST	P$IENC
	MOVE	R12,[440700,,[ASCIZ/**/]]
	TLNN	FLAG,PATHFR
	 JRST	P$IENS
	HRRI	R12,[ASCIZ/*.*/]
	TLNE	FLAG,PATHAV
	 HRRI	R12,[ASCIZ/*.*;*/]
	JRST	P$IENS
P$IENC:	TLNN	FLAG,PATHAD
	 JRST	P$IBAD
	MOVE	R12,[440700,,[ASCIZ/<</]]
	TLNE	FLAG,PATHCC
	 HRRI	R12,[ASCIZ/</]
	JRST	P$IENS
P$IENN:	TLNE	FLAG,PATHAS
	 TRNE	R10,P$I$EP!P$I$VP
	  JRST	P$IENZ
	TLNE	FLAG,PATHFR
	 TRNE	R10,P$I$AE!P$I$DE
	  CAIN	IO,12
	   JRST	P$IENZ
	CAIN	IO,37
	 JRST	P$IENZ
	LDB	R13,BP
	CAIN	R13,"<"
	 JRST	P$IENT
	MOVEI	R13,">"
	IDPB	R13,BP
	TBOUT	<R13>
	ADDI	UTIL,1
P$IENT:	MOVE	R12,[440700,,[ASCIZ/**/]]
	TLNN	FLAG,PATHFR
	 JRST	P$IENS
	HRRI	R12,[ASCIZ/*.*/]
	TLNE	FLAG,PATHAV
	 HRRI	R12,[ASCIZ/*.*;*/]
P$IENS:	ILDB	R13,R12
	IDPB	R13,BP
	JUMPE	R13,RETN(1)
	TBOUT	<R13>
	AOJA	UTIL,P$IENS
P$IENZ:	SETZ	R13,
	IDPB	R13,BP
	ENDR	SKIP,1
; P$PP -- PROCESS PATH (NODES AND FILES)
;   IN: IO -- SOURCE,,NODE DESTINATION
;	UTIL -- FILE DESTINATION,,EXTENSION DESTINATION
;	FLAG -- PATH CONTEXT FLAGS
;   OUT: FLAG -- FOUND FLAGS
;	 UTIL -- VERSION NUMBER (-1 *) (0 NONE)
;
P$PP:	BEGINR	<BP>
	TLNE	FLAG,PATHNR
	 JRST	P$PN
	HLR	BP,IO
	HRLI	BP,440700
	TLNN	FLAG,PATHNP
	 JRST	P$PF0
	SETZM	(IO)
	MOVE	X1,BP
P$PS2:	MOVE	X2,BP
P$PS1:	ILDB	X3,BP
	CAIE	X3,"<"
	 CAIN	X3,">"
	  JRST	P$PS2
	CAIE	X3,"."
	 CAIN	X3,";"
	  JRST	P$PS3
	JUMPE	X3,P$PS3
	JRST	P$PS1
P$PS3:	MOVE	BP,X2
	CAMN	BP,X1
	 JRST	P$PF
	TLO	FLAG,PATHNF
	MOVE	X1,BP
	LDB	X2,X1
	CAIN	X2,"<"
	 ILDB	X2,X1
	SETZ	X3,
	DPB	X3,X1
	PUSH	STAK,X1
	PUSH	STAK,X2
	CALLR	P$CP
	POP	STAK,X2
	POP	STAK,X1
	DPB	X2,X1
	JRST	P$PF
P$PN:	TLO	FLAG,PATHNF
	CALLR	P$CP
	RETURN
P$PF:	SKIPE	(IO)
	 JRST	P$PF0
	MOVE	X1,[440700,,CONTEX]
	MOVE	X2,[440700,,NBUF]
	SCOPY	(X1,X2)
P$PF0:	TLO	FLAG,PATHFF
	SETZM	(UTIL)
	HLRZ	X1,UTIL
	HRLI	X1,440700
P$PF1:	ILDB	X2,BP
; (((TENEX)))
IFG F.TENX,<
	CAIE	X2,"V"-100
	 JRST	P$PF7
	ILDB	X2,BP
	IDPB	X2,X1
	JRST	P$PF1
P$PF7:
>
; (((↑↑↑)))
	IDPB	X2,X1
	JUMPE	X2,P$PF3
	CAIN	X2,";"
	 JRST	P$PF4
	CAIE	X2,"."
	 JRST	P$PF1
	SETZ	X2,
	DPB	X2,X1
	HRRZI	X1,(UTIL)
	HRLI	X1,440700
P$PF2:	ILDB	X2,BP
; (((TENEX)))
IFG F.TENX,<
	CAIE	X2,"V"-100
	 JRST	P$PF8
	ILDB	X2,BP
	IDPB	X2,X1
	JRST	P$PF2
P$PF8:
>
; (((↑↑↑)))
	IDPB	X2,X1
	CAIN	X2,";"
	 JRST	P$PF4
	JUMPN	X2,P$PF2
P$PF3:	SETZ	UTIL,
	RETURN
P$PF4:	SETZ	X2,
	DPB	X2,X1
	ILDB	X2,BP
	CAIE	X2,"*"
	 JRST	P$PF5
	SETO	UTIL,
	RETURN
P$PF5:	SETZ	UTIL,
P$PF6:	SUBI	X2,"0"
	IMULI	UTIL,↑D10
	ADDI	UTIL,(X2)
	ILDB	X2,BP
	JUMPN	X2,P$PF6
	ENDR
; CONVERT PATH FROM DFTP FORM TO DATACOMPUTER FORM
;   IN: IO -- SOURCE,,DESTINATION
; 	FLAG -- PATH CONTEXT FLAGS
;
P$CP:	BEGINR	<IO,FLAG>
	MOVEI	X1,<<LBSIZE*5>-1>
	HLRZ	X2,IO
	HRLI	X2,350700
	HRRI	X3,(IO)
	HRLI	X3,440700
	LDB	IO,X2
	CAIN	IO,"<"
	 JRST	P$CPCX
	TLNE	FLAG,PATHCT
	 JRST	P$CPCT
	TLNE	FLAG,PATHCA
	 JRST	P$CPCA
	JRST	P$CPCC
P$CPCX:	ILDB	IO,X2
	CAIE	IO,"<"
	 JRST	P$CPCC
	ILDB	IO,X2
	CAIE	IO,"<"
	 JRST	P$CPCA
	ILDB	IO,X2
P$CPCT:	MOVE	X4,[440700,,[ASCIZ/%TOP./]]
	SCOPY	(X4,X3)
	MOVE	X4,[440700,,ANCHOR]
	SCOPY	(X4,X3)
	SUBI	X1,11
	JRST	P$CPCE
P$CPCA:	MOVE	X4,[440700,,[ASCIZ/%LOGIN/]]
	SCOPY	(X4,X3)
	SUBI	X1,6
	JRST	P$CPCE
P$CPCC:	MOVE	X4,[440700,,CONTEX]
	ILDB	0,X4
	JUMPE	0,.+4
	SOJL	X1,P$CPE
	IDPB	0,X3
	JRST	.-4
	MOVE	X4,X3
	IDPB	0,X4
P$CPCE:	JUMPE	IO,P$CPZ0
	MOVEI	X4,"."
	IDPB	X4,X3
	MOVEI	X4,42
	SETZ	FLAG,
	SOJA	X1,P$CPI0
P$CPI:	ILDB	IO,X2
P$CPI0:	CAIN	IO,"P"-100
	 JRST	P$CPI
	CAIN	IO,">"
	 JRST	P$CPS
	JUMPE	IO,P$CPZ
	JUMPN	FLAG,P$CPO
	CAIN	IO,":"
	 JRST	P$CPP
	CAIN	IO,"*"
	 JRST	P$CPO
	CAIL	IO,"A"
	 CAILE	IO,"Z"
	  JRST	P$CPQ
P$CPO:	SOJL	X1,P$CPE
	IDPB	IO,X3
	JRST	P$CPI
P$CPQ:	SOJL	X1,P$CPE
	IDPB	X4,X3
	JRST	P$CPO
P$CPS:	JUMPE	FLAG,.+6
	MOVEI	IO,"'"
	IDPB	IO,X3
	MOVEI	IO,")"
	IDPB	IO,R3
	SETZ	FLAG,
	MOVEI	IO,"."
	JRST	P$CPO
P$CPP:	SUBI	X1,4
	JUMPL	X1,P$CPE
	MOVEI	IO,"("
	IDPB	IO,R3
	MOVEI	IO,"'"
	IDPB	IO,R3
	SETO	FLAG,
	JRST	P$CPI
P$CPE:	TSOUT	<[ASCIZ/ (Pathname too long)/],CRLF>
	MOVE	STAK,[IOWD STSIZ,STBEG]
	JRST	CMDCMD
P$CPZ:	JUMPE	FLAG,P$CPZ0
	MOVEI	X1,"'"
	IDPB	X1,X3
	MOVEI	X1,")"
	IDPB	X1,X3
P$CPZ0:	IDPB	IO,X3
	ENDR
; LOCAL FILE NAME PREPARATION
;   IN: IO -- FILE LOCATION,,EXTENSION LOCATION
;
P$LF:	BEGINR	<IO>
; (((TENEX)))
IFG F.TENX,<
	SKIPE	LFILE
	 RETURN
>
; (((↑↑↑)))
	HLL	X1,IO
	HRRI	X1,FSBUF
	BLT	X1,<FSBUF+SBSIZE-1>
	LDB	X1,[350700,,FSBUF]
	CAIN	X1,"*"
	 SETOM	FSBUF
	HRLZI	X1,(IO)
	HRRI	X1,ESBUF
	BLT	X1,<ESBUF+SBSIZE-1>
	LDB	X1,[350700,,ESBUF]
	CAIN	X1,"*"
	 SETOM	ESBUF
	CAIN	X1,0
	 SETZM	ESBUF
	HLR	X1,IO
	HRLI	X1,440700
	MOVE	X2,[440700,,ABUF]
P$LF1:	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,P$LF1
	SKIPN	(IO)
	 JRST	P$LF2
	MOVEI	X3,"."
	DPB	X3,X2
	HRRZI	X1,(IO)
	HRLI	X1,440700
P$LF3:	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,P$LF3
P$LF2:
; (((TOPS-10+ITS)))
IFLE F.TENX,<
	HRRZI	IO,ABUF
	CALLR	LUTFN
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	MOVEM	UTIL,VSBUF
	JUMPE	UTIL,P$LFX1
	SKIPE FLAG20
	 SKIPA X3,["."]		; Twenex version delimiter
	  MOVEI X3,";"		; Tenex version delimiter
	DPB	X3,X2
	JUMPG	UTIL,P$LFX0
	MOVEI	X3,"*"
	IDPB	X3,X2
	SETZ	X3,
	IDPB	X3,X2
	JRST	P$LFX1
P$LFX0:	MOVE	X1,X2
	MOVE	X2,UTIL
	MOVEI	X3,↑D10
	NOUT
	 THUD
P$LFX1:	MOVE	IO,[ABUF,,LFILE]
	BLT	IO,<LFILE+SBSIZE-1>
>
; (((↑↑↑)))
	ENDR
	SUBTTL Datacomputer interface routines
PRINTX (Datacomputer interface routines)

; DALO -- ALLOCATE SPACE
;
DALO:	BEGINR
	DCSOUT	<[ASCIZ/MODIFY /],NBUF,<[ASCIZ/,M=/]>>
	MOVE	IO,ABUF
	DCNOUT	<IO>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; DATT -- LOGIN TO NODE
;
DATT:	BEGINR
	DCSOUT	<[ASCIZ/LOGIN /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[ASCII/%LOGI/]
	MOVEM	X1,CONTEX
	MOVE	X1,[ASCII/N/]
	MOVEM	X1,<CONTEX+1>
	SKIPN	OPENED
	 RETURN
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR
; DBIG -- CREATE A <BIG> FILE
;
DBIG:	BEGINR	<IO>
	DCSOUT	<[ASCIZ/LIST /],NBUF,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DBIG1
	TSOUT	<[ASCIZ/ [Old Node]/],CRLF>
	JRST	DBIG2
DBIG1:	TSOUT	<[ASCIZ/ [New Node]/],CRLF>
	DCSOUT	<[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DBIG2:	SKIPN	OPENED
	 JRST	DBIG3
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	SETZM	OPENED
DBIG3:	DCSOUT	<[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<BIG">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	SETZM	OPENEM
	DCSOUT	<[ASCIZ/"<FILES">="<TERSE">/],SEMI>
	MOVE	IO,[ASCII/.I231/]
	CALLR	RENFIP
	 RETURN
	MOVEI	IO,"Z"-100
	DCBOUT	<IO>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,CONTEX]
	SCOPY	(X1,X2)
	ENDR
; DCHA -- CHANGE PRIVILEGES (DELETE AND ADD)
;
DCHA:	BEGINR	<IO,UTIL>
	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIV/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCHAD:	DCSOUT	<[ASCIZ/DELETEP /],NBUF,<[ASCIZ/,N=1/]>,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAIA
	  JRST	DCHAD
	TSOUT	<[ASCIZ/ [Ok]/],CRLF>
DCHAI:	TAIN	<[ASCIZ/ Add a new privilege? /]>
	 RETURN
	 RETURN
	SETZM	ABUF		; WRITE FLAG
	SETZM	<ABUF+1>	; HOST
	SETZM	<ABUF+2>	; SOCKET
	SETOM	<ABUF+3>	; PASSWORD
	TAIN	<[ASCIZ/  Allow control? /]>
	 JRST	DCHAI
	 SETOM	ABUF
	TAIN <[ASCIZ/  Restrict via network? /]>
	 JRST DCHAI
	 JRST DCHAI5
	TAIN <[ASCIZ/   Restrict via local host? /]>
	 JRST DCHAI
	 JRST DCHAI1
	MOVE IO,LHOST
	JRST DCHAI2
DCHAI1:	TSOUT <[ASCIZ/    Host number (octal): /]>
	TNIN ([ASCIZ/    Host number (octal): /],10)
	 JRST DCHAI
	JUMPN IO,DCHA1A
	MOVE IO,LHOST
	TNOUT (IO,10)
DCHA1A:	TSOUT <CRLF>
DCHAI2:	MOVEM IO,<ABUF+1>
	TAIN <[ASCIZ/   Restrict via user? /]>
	 JRST DCHAI
	 JRST DCHAI5
	MOVE IO,ABUF+1
; (((CMU)))
IFN F.CMU,<
	CAIE IO,16
	 CAIN IO,116
	  JRST DCHAI3
	CAIE IO,216
>; IFN F.CMU
; (((↑↑↑)))
	 CAMN IO,ABUF
	  JRST DCHAI3
	TSOUT <[ASCIZ/    Socket number (octal): /]>
	TNIN ([ASCIZ/    Socket number (octal): /],10)
	 JRST DCHAI
	JRST DCHAI4
DCHAI3:
; (((ITS)))
IFL F.TENX,<
	TSOUT <[ASCIZ/    User: ANY/]>
	SETZ IO,
>;IFL F.TENX
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
	TSOUT <[ASCIZ/    User: ANY/]>
	SETZ IO,
>;IFN F.SAIL
; (((↑↑↑)))
; (((TOPS-10 NOT SAIL)))
IFE F.TENX!F.SAIL,<
; (((NOT CMU)))
IFE F.CMU,<
	TSOUT <[ASCIZ/    User: /]>
	TNIN ([ASCIZ/    User: /],10)
	 JRST DCHAI
>;IFE F.CMU
; (((↑↑↑)))
; (((CMU)))
IFN F.CMU,<
	MOVE IO,[UBUF1,,6]
	TSOUT <[ASCIZ/    User: /]>
	HRRZI UTIL,[ASCIZ/    User: /]
	CALLR $TSIN$
	 JRST DCHAI
	JUMPE UTIL,[	GETPPN IO,
			 JFCL
			TLO IO,-1
			MOVE UTIL,[IO,,UBUF1]
			DECCMU UTIL,
			 JRST DCHAI7
			MOVEI UTIL," "
			DPB UTIL,[350700,,UBUF1]
			TSOUT <UBUF1>
			JRST DCHAI7]
	MOVE X1,UBUF1
	MOVE X2,UBUF2
	LSHC X1,-1
	ASHC X1,-7
	LSHC X1,1
	TLO X1,(<ASCII /*/>)
	MOVE UTIL,[IO,,X1]
	CMUDEC UTIL,
	 JRST DCHAI8
DCHAI7:	TLZ IO,-1
>;IFN F.CMU
; (((↑↑↑)))
	LSH IO,11
	ADDI IO,100
>;IFE F.TENX!F.SAIL
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	TSOUT <[ASCIZ/    User: /]>
	TSIN (UBUF1,LBSIZE,[ASCIZ/    User: /])
	 JRST DCHAI
	SETZ X1,
	MOVE X2,[440700,,UBUF1]
	STDIR
	 JRST DCHAI8
	 JRST DCHAI8
	HRRZI IO,(X1)
	LSH IO,↑D15
	ADDI IO,20
>;IFG F.TENX
; (((↑↑↑)))
DCHAI4:	MOVEM IO,<ABUF+2>
	TSOUT <CRLF>
DCHAI5:	TAIN	<[ASCIZ/  Restrict via password? /]>
	 JRST	DCHAI
	 JRST	DCHAC
	TSOUT	<[ASCIZ/   Password: /]>
	TSIN	(<ABUF+3>,<SBSIZE-3>,[ASCIZ/   Password: /])
	 JRST	DCHAI
	TSOUT	<CRLF>
DCHAC:	DCSOUT	<[ASCIZ/CREATEP /],NBUF,<[ASCIZ/,U=**,G=LR/]>>
	SKIPE	ABUF
	 JRST	DCHAC1
	DCSOUT	<[ASCIZ/CWA/]>
DCHAC1:	SKIPN	<ABUF+1>
	 JRST	DCHAC3
	DCSOUT	<<[ASCIZ/,H=/]>>
	MOVE	IO,<ABUF+1>
	DCNOUT	<IO>
	DCSOUT	<<[ASCIZ/,S=/]>>
	MOVE	IO,<ABUF+2>
	JUMPE	IO,DCHAC2
	DCNOUT	<IO>
	JRST	DCHAC3
DCHAC2:	DCSOUT	<[ASCIZ/ANY/]>
DCHAC3:	SETO	IO,
	CAMN	IO,<ABUF+3>
	 JRST	DCHAC4
	DCSOUT	<<[ASCIZ/,P='/]>,<ABUF+3>,[ASCIZ/'/]>
DCHAC4:	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	TSOUT	<[ASCIZ/  [Ok]/],CRLF>
	JRST	DCHAI
DCHAI8:	TSOUT <[ASCIZ/ (User not found)/],CRLF>
	JRST DCHAI
	ENDR
; DCON -- CONNECT (VERIFY CONTEXT)
;
DCON:	BEGINR
	DCSOUT	<[ASCIZ/LIST /],NBUF,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DCON1
	TSOUT	<[ASCIZ/ [Old Node]/],CRLF>
	JRST	DCON2
DCON1:	TAIN	<[ASCIZ/ [New Node][Confirm]/]>
	 RETURN
	 RETURN
	DCSOUT	<[ASCIZ/CREATE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
DCON2:	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,CONTEX]
	SCOPY	(X1,X2)
	ENDR

; DCRE -- CREATE NEW NODE
;
DCRE:	BEGINR
	DCSOUT	<[ASCIZ/CREATE /],NBUF,<[ASCIZ/,M=/]>>
	MOVEI	IO,DEFALO
	DCNOUT	<IO>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	CALLR	DCHA
	ENDR
; DDEL -- DELETE FILES
;
DDEL:	BEGINR	<IO>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	SETO	IO,
	CALLR	D$VER
	 RETURN
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE DELETED INTEGER
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DELETED=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		STATUS='D'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		DELETED=DELETED+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF DELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END;
/]>
	CALLR	RENDER
	 RETURN
	ENDR
; DDIR -- FILE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DDIR:	BEGINR	<IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
	SETZM	FLAGCO
>
; (((↑↑↑)))
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPN	VBUF
	 SETOM	VBUF
	SETZ	UTIL,
	CAIN	FLAG,DD$D
	 JRST	DDIRO1
	CAIN	FLAG,DD$T
	 JRST	DDIRO2
	CAIN	FLAG,DD$V
	 JRST	DDIRO3
	RETURN
DDIRO1:	DCSOUT	<[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ 'D'/]
	JRST	DDIRO4
DDIRO2:	DCSOUT	<[ASCIZ/"<TERSE">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	JRST	DDIRO4
DDIRO3:	DCSOUT	<[ASCIZ/"<VERBOSE">="<FILES">/]>
	SETZ	IO,
DDIRO4:	CALLR	D$WITH
	DCSOUT	<SEMI>
	MOVE	IO,[ASCII/.I241/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DDIRF:	CALLR	RENPRE
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DDIRF:	SKIPN	FLAGCO
	 JRST	DDIRF0
	HRROI	X1,[ASCIZ/ [Aborting]
/]
	PSOUT
	MOVE	X1,DCOJFN
	MOVEI	X2,22
	MTOPR
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	DCSOUT	<SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DDIRF0:	CALLR	RENPRE
>
; (((↑↑↑)))
	CAMN	IO,[ASCII/     /]
	 JRST	DDIRF1
	CAMN	IO,[ASCII/.I261/]
	 JRST	DDIRF3
	LDB	IO,[350700,,IO]
	CAIN	IO,";"
	 JRST	DDIRF2
	CALLR	RENLIP
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DDIRF1:	CALLR	<(FLAG)>
	AOJA	UTIL,DDIRF
DDIRF2:	CALLR	RENLIN
	JRST	DDIRF
DDIRF3:	CALLR	RENLIN
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	UTIL,RETN(0)
	TSOUT	<[ASCIZ/ [No Files]/],CRLF>
	ENDR
; DD$D -- DELETED FILES
;
DD$D:	BEGINR
	CALLR	DD$T
	ENDR

; DD$T -- TERSE FILES
;
DD$T:	BEGINR	<IO>
	SKIPE	FLAGDD
	 JRST	DD$T1
	MOVEI	IO,11
	TBOUT	<IO>
DD$T1:	DCBIN	<IO>
	SKIPE	FLAGDD
	 JRST	DD$T2
	TBOUT	<IO>
DD$T2:	CAIE	IO,12
	 JRST	DD$T1
	ENDR

; DD$V -- VERBOSE FILES
;
DD$V:	BEGINR	<IO>
	SKIPE	FLAGDD
	 JRST	DD$V1
	MOVEI	IO,11
	TBOUT	<IO>
DD$V1:	DCBIN	<IO>
	SKIPE	FLAGDD
	 JRST	DD$V3
	CAIN	IO,11
	 JRST	DD$V2
	TBOUT	<IO>
	JRST	DD$V3
DD$V2:	TSOUT	<CRLF>
	TBOUT	<IO>
	TBOUT	<IO>
	JRST	DD$V1
DD$V3:	CAIE	IO,12
	 JRST	DD$V1
	ENDR
; DEXA -- EXAMINE (LIST FILES TO TERMINAL)
;
DEXA:	BEGINR	<IO,FLAG>
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAME	X2,LDIR
	 CALLR	D$CON
>
; (((↑↑↑)))
	SETZ	FLAG,
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPLE	VBUF
	 JRST	DEXA1
	MOVEI	IO," "
	CALLR	D$VER
	 RETURN
	JRST	DEXA2
DEXA1:	CALLR	D$VEX
	 RETURN
DEXA2:	DCSOUT	<[ASCIZ/"<GET">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<SEMI>
	CALLR	NETOI
	 THUD
	MOVE	IO,[ASCII/;I249/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SETZM	NSUM
IFN F.TENX!F.SAIL,< SETZM FLAGSM >
DEXA3:	SETZM	DEXA$L
	CALLR	EXAFIL
	 JRST	DEXA4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	MOVNI	IO,10
	CAMN	IO,DEXA$L
	 AOJA	FLAG,DEXA4
	SKIPE	FLAGTT
	 CALLR	NETRAT
	AOJA	FLAG,DEXA3
DEXA4:	CALLR	NETC
	MOVE	IO,[ASCII/;I269/]
	CALLR	RENFIP
	 JRST	DEXAE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	FLAG,RETN(1)
	TSOUT	<[ASCIZ/ (No Such File)/],CRLF>
	RETURN	SKIP,1
DEXAE:	CALLR	D$CON
	ENDR
; EXAMINE -- TERMINAL OUTPUT
;   IN: IO -- COUNT OF CHARACTERS IN BUFFER
;	BP -- BYTE POINTER INTO BUFFER
DEXA$:	BEGINR	<UTIL,FLAG>
	SKIPGE	DEXA$L
	 RETURN
	SETZ	FLAG,
DEXA$1:	SKIPG	IO
	 RETURN
	ILDB	UTIL,BP
	CAIGE	UTIL," "
	 JRST	DEXA$3
DEXA$2:	TBOUT	<UTIL>
	SOJA	IO,DEXA$1
DEXA$3:	CAIE	UTIL,15
	 CAIN	UTIL,11
	  JRST	DEXA$2
	CAIE	UTIL,12
	 CAIN	UTIL,37
	  JRST	DEXA$4
	CAIG	IO,5
	 JUMPE	UTIL,RETN(0)
	PUSH	STAK,UTIL
	MOVEI	UTIL,"↑"
	TBOUT	<UTIL>
	POP	STAK,UTIL
	ADDI	UTIL,100
	TBOUT	<UTIL>
	ADDI	FLAG,1
	CAIE	FLAG,20
	 SOJA	IO,DEXA$1
	JRST	DEXA$5
DEXA$4:	AOS	X1,DEXA$L
	CAML	X1,DEXA$P
	 CAIG	IO,5
	  JRST	DEXA$2
	SUBI	IO,1
	SETZM	DEXA$L
DEXA$5:	SETZ	FLAG,
	TSOUT	<CRLF,[ASCIZ/ More? /]>
DEXA$6:	TBIN	<UTIL>
	CAIN	UTIL,15
	 JRST	DEXA$6
	CAIE	UTIL,"Y"
	 CAIN	UTIL,12
	  JRST	DEXA$7
	CAIE	UTIL,33
	 CAIN	UTIL,37
	  JRST	DEXA$7
	CAIN	UTIL," "
	 JRST	DEXA$7
	CAIE	UTIL,"A"
	 CAIN	UTIL,177
	  JRST	DEXA$8
	JRST	DEXA$9
DEXA$7:	TSOUT	<[ASCIZ/Yes/],CRLF>
	JRST	DEXA$1
DEXA$8:	TSOUT	<[ASCIZ/Abort/],CRLF>
	MOVNI	X1,10
	MOVEM	X1,DEXA$L
	RETURN
DEXA$9:	TSOUT	<[ASCIZ/No/],CRLF>
	SETOM	DEXA$L
	ENDR
; DEXP -- EXPUNGE
;
DEXP:	BEGINR	<IO>
	SKIPN	OPENED
	 JRST	DEXP1
	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
DEXP1:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES"> %INFORMATION/],SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	CAMN	IO,[ASCII/.I280/]
	 JRST	DEXP2
	TSOUT	<[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
DEXP2:	DCBIN	<IO>
	CAIN	IO," "
	 JRST	DEXP3
	CAIE	IO,12
	 JRST	DEXP2
	DCBIN	<IO>
	CAIN	IO," "
	 JRST	DEXP3
	CALLR	RENLIN
	RETURN
DEXP3:	DCBIN	<IO>
	CAIE	IO,"R"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"E"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"C"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"S"
	 JRST	DEXP2
	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DEXP2
	CALLR	DCNIN
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	JUMPN	IO,DEXP4
	DCSOUT	<[ASCIZ/DELETE /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN
DEXP4:	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	DCSOUT	<[ASCIZ/OPEN /],NBUF,<[ASCIZ/."<FILES">,SYN="<">/]>,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/"<FILES">="<"> WITH STATUS EQ ' '/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JFCL
	DCSOUT	<[ASCIZ/CLOSE "<">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	SETZM	OPENED
	ENDR
; DGET -- GET-RETRIEVE
;
DGET:	BEGINR	<IO,FLAG>
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAME	X2,LDIR
	 CALLR	D$CON
>
; (((↑↑↑)))
	SETZ	FLAG,
	SETO	IO,
	CALLR	D$OPEN
	 RETURN
	SKIPLE	VBUF
	 JRST	DGET1
	MOVEI	IO," "
	CALLR	D$VER
	 RETURN
	JRST	DGET2
DGET1:	CALLR	D$VEX
	 RETURN
DGET2:	DCSOUT	<[ASCIZ/"<GET">="<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<SEMI>
	CALLR	NETOI
	 THUD
	MOVE	IO,[ASCII/;I249/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SKIPE	FLAGNN
	 JRST	DGET$
	TSOUT	<[ASCIZ/ [Ok]/],CRLF>
DGET$:	SETZM	NSUM
IFN F.TENX!F.SAIL,< SETZM FLAGSM >
DGET3:	CALLR	GETFIL
	 JRST	DGET4		; EXIT RETRIEVAL LOOP ON NETWORK EOF
	CALLR	LOCNFO
	SETZM	FLAGFE
	CALLR	LOCOO
	 SETOM	FLAGFE
	CALLR	GETDAT
	CALLR	LOCC
	SKIPE	FLAGTT
	 CALLR	NETRAT
	AOJA	FLAG,DGET3
DGET4:	CALLR	NETC
	MOVE	IO,[ASCII/;I269/]
	CALLR	RENFIP
	 JRST	DGETE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	JUMPN	FLAG,RETN(1)
	TSOUT	<[ASCIZ/ (No Such File)/],CRLF>
	RETURN	SKIP,1
DGETE:	CALLR	D$CON
	ENDR
; FIELD LENGTHS IN WORDS FROM <GET>
	GET$F==SBSIZE		; FILENAME
	GET$E==SBSIZE		; EXTENSION
	GET$D==4		; DATE
; DLIN -- DATACOMPUTER LINK
;
DLIN:	BEGINR	<IO,UTIL,FLAG>
	MOVE	FLAG,FLAGDD
DLINI:	TSOUT	(<[BYTE (7)76,0,0,0,0]>)
	TSIN	(ABUF,SBSIZE,<[BYTE (7)76,0,0,0,0]>)
	 JRST	DLINI
	JUMPE	UTIL,DLINE
	TSOUT	<CRLF>
	SETZM	FLAGDD
	DCSOUT	<ABUF,CRLF>
	SETOM	FLAGDD
	CALLR	RENDER
	 JRST	DLINI
	JRST	DLINI
DLINE:	TSOUT	<[ASCIZ/[Returning]/],CRLF>
	MOVEM	FLAG,FLAGDD
	ENDR
; DLIS -- NODE DIRECTORY
;   IN:  FLAG -- ADDRESS OF ARGUMENT PROCESSING ROUTINE
;
DLIS:	BEGINR	<IO,UTIL>
; (((TENEX)))
IFG F.TENX,<
	SETZM	FLAGCO
>
; (((↑↑↑)))
	CAIN	FLAG,DL$T
	 JRST	DLISO1
	CAIN	FLAG,DL$V
	 JRST	DLISO2
	CAIN	FLAG,DL$P
	 JRST	DLISO3
	RETURN
DLISO1:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %NAME/],SEMI>
	JRST	DLISI
DLISO2:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %INFORMATION/],SEMI>
	JRST	DLISI
DLISO3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/ %PRIVILEGE/],SEMI>
DLISI:	SETZB	UTIL,GBUF1
	MOVE	X1,[GBUF1,,GBUF1+1]
	BLT	X1,<GBUF1+LBSIZE-1>
	MOVEI	X1,<GBUF2+1>
	MOVEM	X1,GBUF2
	CALLR	RENPRE
	CAMN	IO,[ASCII/.I280/]
	 JRST	DLISD
	CALLR	RENLIP
	JRST	DLISER
; (((TOPS-10+ITS)))
IFLE F.TENX,<
DLISN:	DCBIN	<IO>
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
DLISN:	SKIPN	FLAGCO
	 JRST	DLISN0
	HRROI	X1,[ASCIZ/ [Aborting]
/]
	PSOUT
	MOVE	X1,DCOJFN
	MOVEI	X2,22
	MTOPR
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	DCSOUT	<SEMI>
	JRST	DLISER
DLISN0:	DCBIN	<IO>
>
; (((↑↑↑)))
	CAIE	IO," "
	 JRST	DLISE
	SETO	UTIL,
	SKIPE	FLAGDD
	 JRST	DLISD
	CALLR	<(FLAG)>
	JRST	DLISN
DLISD:	CALLR	RENLIN
	JRST	DLISN
DLISE:	CAIN	IO,"?"
	 JRST	DEATH
	CALLR	RENLIN
	JUMPN	UTIL,DLISER
	TSOUT	<[ASCIZ/ [No Nodes]/],CRLF>
DLISER:	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR
; DL$T -- TERSE NODES
;
DL$T:	BEGINR
	CALLR	DL$NAM
	 JRST	DL$T0
	TSOUT	<CRLF>
DL$T0:	CALLR	RENLIN
	ENDR

; DL$V -- VERBOSE NODES
;
DL$V:	BEGINR	<IO,UTIL,FLAG>
DL$VN:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DL$VN
	CALLR	DL$NAM
	 JRST	DL$VE
	TSOUT	<CRLF>
	MOVEI	UTIL,GBUF1
	SKIPE	(UTIL)
	 AOJA	UTIL,.-1
	SUBI	UTIL,GBUF1
DL$VF:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	DL$VF
	DCBIN	<IO>
	SETZ	FLAG,
	CAIN	IO,"F"
	 MOVEI	FLAG,5
	CAIN	IO,"P"
	 MOVEI	FLAG,1
	CAIN	IO,"N"
	 MOVEI	FLAG,3
	JUMPE	FLAG,DL$VE
	CALLR	RENLIN
DL$VD:	MOVEI	IO,(UTIL)
DL$VD0:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IO,DL$VD0
	MOVEI	IO,"]"
	TBOUT	<IO>
DL$VD1:	DCBIN	<IO>
	TBOUT	<IO>
	CAIE	IO,12
	 JRST	DL$VD1
	SOJG	FLAG,DL$VD
	RETURN
DL$VE:	CALLR	RENLIN
	ENDR
; DL$P -- PROTECTION
;
DL$P:	BEGINR	<IO>
	CALLR	DL$NAM
	 JRST	DL$P1
	TSOUT	<CRLF>
	CALLR	RENLIN
	RETURN
DL$P1:	MOVEI	IO,GBUF1
DL$P2:	SKIPE	(IO)
	 AOJA	IO,DL$P2
	SUBI	IO,GBUF1
DL$P3:	TSOUT	<[ASCIZ/    /]>
	SOJGE	IO,DL$P3
	MOVEI	IO,"]"
	TBOUT	<IO>
DL$P4:	DCBIN	<IO>
	TBOUT	<IO>
	CAIE	IO,12
	 JRST	DL$P4
	ENDR
; DL$NAM -- DIRECTORY: NAME OUTPUT
;   OUT: IO -- LAST CHARACTER INPUT
;
DL$NAM:	BEGINR	<BP,UTIL,FLAG,R10>
	SETZB	R10,FLAG
	MOVE	BP,[440700,,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
	DCBIN	<IO>
	CAILE	IO," "
	 JRST	DL$NA1
	RETURN
DL$NAN:	DCBIN	<IO>
DL$NA1:	CAIN	IO,"."
	 JRST	DL$NIN
	CAIG	IO," "
	 JRST	DL$NA3
	CAIE	IO,42
	 JRST	DL$NA2
	DCBIN	<IO>
DL$NA2:	IDPB	IO,BP
	SOJG	UTIL,DL$NAN
	JRST	DL$NER
DL$NA3:	SETZ	X1,
	IDPB	X1,BP
	TSOUT	<[ASCIZ/  /],ABUF>
	RETURN	SKIP,1
DL$NIN:	MOVE	BP,[440700,,ABUF]
	MOVEI	UTIL,<SBSIZE*5>
DL$NI1:	DCBIN	<IO>
	CAIE	IO,"."
	 CAIG	IO," "
	  JRST	DL$NCN
DL$NI2:	CAIE	IO,42
	 JRST	DL$NI3
	DCBIN	<IO>
DL$NI3:	IDPB	IO,BP
	SOJG	UTIL,DL$NI1
	JRST	DL$NER
DL$NCN:	SETZ	X1,
	IDPB	X1,BP
	SKIPN	X2,GBUF1(FLAG)
	 JRST	DL$NON
	HRLI	X2,440700
	MOVE	X1,[440700,,ABUF]
DL$NC1:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	DL$NON
	JUMPN	X3,DL$NC1
	CAIG	IO," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NON:	CAIL	FLAG,LBSIZE-2
	 JRST	DL$NER
	SETZM	GBUF1+1(FLAG)
	HRL	X1,GBUF1+1(FLAG)
	HRR	X1,GBUF1+2(FLAG)
	BLT	X1,<GBUF1+LBSIZE-1>
	MOVE	X1,[440700,,ABUF]
	SKIPN	X2,GBUF1(FLAG)
	 MOVE	X2,GBUF2
	HRLI	X2,440700
	HRRZI	BP,(BP)
	SUBI	BP,<ABUF-1>
	ADDI	BP,(X2)
	CAIL	BP,<GBUF2+LBSIZE>
	 JRST	DL$NER
	HRRZM	X2,GBUF1(FLAG)
DL$NO1:	ILDB	X3,X1
	IDPB	X3,X2
	JUMPN	X3,DL$NO1
	HRRZI	X2,1(X2)
	MOVEM	X2,GBUF2
	MOVEI	UTIL,(FLAG)
	JUMPE	R10,DL$NO2
	TSOUT	<CRLF>
DL$NO2:	TSOUT	<[ASCIZ/    /]>
	SOJGE	UTIL,DL$NO2
	TSOUT	<ABUF>
	SETO	R10,
	CAIG	IO," "
	 RETURN	SKIP,1
	AOJA	FLAG,DL$NIN
DL$NER:	TSOUT	<[ASCIZ/ (Pathname too long)/],CRLF>
	ENDR
; DPUT -- PUT-STORE
;
DPUT:	BEGINR	<IO>
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAME	X2,LDIR
	 CALLR	D$CON
>
; (((↑↑↑)))
	CALLR	LOCFFI
	 RETURN
	SKIPN	OPENED
	 JRST	DPUT3
	MOVE	X1,[440700,,OPENED]
	MOVE	X2,[440700,,NBUF]
DPUT1:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	DPUT2
	JUMPN	X3,DPUT1
	MOVEI	X1,1
	CAMN	X1,OPENEM
	 JRST	DPUT5
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	JRST	DPUT5
DPUT2:	SETZM	OPENED
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
DPUT3:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JRST	DPUT4
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	JRST	DPUT5
DPUT4:	DCSOUT	<[ASCIZ/CREATE /],NBUF,[ASCIZ/."<FILES"> LIKE %TOP.DFTP."<FILE">/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	SKIPE	FLAGNN
	 JRST	DPUT$1
	TSOUT	<[ASCIZ/ [New <FILES>]/],CRLF>
DPUT$1:	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	SETZM	OPENEM
	DCSOUT	<[ASCIZ/"<FILES">="<TERSE">/],SEMI>
	MOVE	IO,[ASCII/.I231/]
	CALLR	RENFIP
	 RETURN
	MOVEI	IO,"Z"-100
	DCBOUT	<IO>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEI	X1,1
	MOVEM	X1,OPENEM
	SETZM	VBUF
	JRST	DPUT6
DPUT5:	SETZB	IO,VBUF
	CALLR	D$VER
	 RETURN
DPUT6:	AOS	VBUF
	DCSOUT	<[ASCIZ/"<FILES">="<PUT">/],SEMI>
	CALLR	NETOO
	 THUD
	MOVE	IO,[ASCII/;I239/]
	CALLR	RENFIP
	 RETURN
	CALLR	RENLIN
	SKIPE	FLAGNN
	 JRST	DPUT$2
	TSOUT	<[ASCIZ/ [Ok]/],CRLF>
DPUT$2:	SETZM	NSUM
IFN F.TENX!F.SAIL,< SETZM FLAGSM >
	CALLR	LOCOI
	 THUD
	CALLR	NETFFI
DPUT7:	CALLR	PUTFIL
	CALLR	PUTDAT
	SKIPE	FLAGTT
	 CALLR	NETRAT
	CALLR	LOCNFI
	 JRST	DPUT7
	CALLR	NETC
	MOVE	IO,[ASCII/;I259/]
	CALLR	RENFIP
	 JRST	DPUTE
	CALLR	RENLIN
	CALLR	NETSUM
	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	RETURN	SKIP,1
DPUTE:	CALLR	D$CON
	ENDR
; DREM -- DELETE NODES
;
DREM:	BEGINR
	SKIPN	OPENED
	 JRST	DREM0
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	SETZM	OPENED
DREM0:	DCSOUT	<[ASCIZ/DELETE /],NBUF,SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JFCL
	DCSOUT	<[ASCIZ/LIST /],CONTEX,SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAIA
	  RETURN
	TSOUT	<[ASCIZ/ [Connected To Attached Node]/],CRLF>
	MOVE	X1,[ASCII/%LOGI/]
	MOVEM	X1,CONTEX
	MOVE	X1,[ASCII/N/]
	MOVEM	X1,<CONTEX+1>
	ENDR
; DREN -- RENUMBER FILES
;
DREN:	BEGINR	<IO,UTIL>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	SETO	IO,
	CALLR	D$VER
	 RETURN
	MOVE	UTIL,VBUF
	MOVE	IO,ABUF
	MOVEM	IO,VBUF
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ DECLARE SAMEVERSION INTEGER/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ SAMEVERSION=0/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ FOR FILES IN "<FILES">/]>
	SETZ	IO,
	CALLR	D$WITH
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  SAMEVERSION=SAMEVERSION+1/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ IF SAMEVERSION NE 0 THEN ERROR 'VERSION ALREADY EXISTS'/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	MOVEM	UTIL,VBUF
	DCSOUT	<[ASCIZ/BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ DECLARE RENUMBERED INTEGER/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ RENUMBERED=0/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ ' '/]
	CALLR	D$WITH
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ BEGIN/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  COMMENT FILES.FILE.HEADER.FILENAME/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/   ! '.' ! FILES.FILE.HEADER.EXTENSION/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/    ! ';' ! FILES.FILE.HEADER.VERSION/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  VERSION=/]>
	MOVE	IO,ABUF
	DCNOUT	<IO>
	DCSOUT	<CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/  RENUMBERED=RENUMBERED+1/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ END/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/ IF RENUMBERED EQ 0 THEN ERROR 'NO SUCH FILE'/],CRLF>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	ENDR
; DUND -- UNDELETE
;
DUND:	BEGINR	<IO>
	SETZ	IO,
	CALLR	D$OPEN
	 RETURN
	MOVEI	IO,"D"
	CALLR	D$VER
	 RETURN
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE UNDELETED INTEGER
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UNDELETED=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	UPDATE FILES IN "<FILES">/]>
	HRRZI	IO,[ASCIZ/ STATUS EQ 'D'/]
	CALLR	D$WITH
	DCSOUT <[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		STATUS=' '
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		UNDELETED=UNDELETED+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT FILES.FILE.HEADER.FILENAME
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		  ! '.' ! FILES.FILE.HEADER.EXTENSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		    ! ';' ! FILES.FILE.HEADER.VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF UNDELETED EQ 0 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END;
/]>
	CALLR	RENDER
	 RETURN
	ENDR
; D$INIT -- INITIALIZE DATACOMPUTER SESSION
;
D$INIT:	BEGINR	<IO,BP,UTIL,FLAG>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAIA
	  JRST	D$IN0
	TSOUT	<[ASCIZ/ ?? Datacomputer initialization failure ??/],CRLF>
	JRST	QUIT
D$IN0:	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
	HRRZI	UTIL,HOSTS
D$IN1:	SKIPN	(UTIL)
	 JRST	D$IND
	HLRZ	X1,(UTIL)
	CAME	X1,LHOST
	 AOJA	UTIL,D$IN1
	MOVE	IO,[440700,,[ASCIZ/%TOP.DFTP./]]
	MOVE	BP,[440700,,ABUF]
	SCOPY	(IO,BP)
	HRRZ	IO,(UTIL)
	HRLI	IO,440700
	SCOPY	(IO,BP)
	MOVEI	IO,"."
	IDPB	IO,BP
; (((ITS)))
IFL F.TENX,<
	.SUSET [.RXUNAME,,UBUF1]
	SETZM UBUF1+1
>
; (((↑↑↑)))
; (((TOPS-10)))
IFE F.TENX,<
; (((NOT SAIL)))
IFE F.SAIL,<
	HRROI X1,31
	GETTAB	X1,
	 THUD
	HRROI X2,32
	GETTAB	X2,
	 THUD
	MOVEM	X1,UBUF1
	MOVEM	X2,<UBUF1+1>
	SETZM	<UBUF1+2>
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
	GETPPN X1,
	 JFCL
	TRNN X1,770000
	 JRST [	LSH X1,↑D6
		JRST .-1]		; Left Justify SAIL PN's
	HRLZM X1,UBUF1
	SETZM UBUF1+1
>
; (((↑↑↑)))
>
; (((↑↑↑)))
; (((ITS+TOPS-10)
IFLE F.TENX,<
	MOVE	X1,[440600,,UBUF1]
	MOVEI	X2,42
D$IN3:	ILDB	X3,X1
	JUMPE	X3,D$IN4
	ADDI	X3,40
	CAIL	X3,"A"
	 CAILE	X3,"Z"
	  IDPB	X2,BP
	IDPB	X3,BP
	JRST	D$IN3
D$IN4:	MOVE	X1,BP
	IDPB	X3,X1
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	GJINF
	CAMN	X1,X2
	 JRST	D$IN5
	HRROI	X1,[ASCIZ/  (from /]
	PSOUT
	MOVEI	X1,101
	DIRST
	 THUD
	HRROI	X1,RPAREN
	PSOUT
D$IN5:	HRROI	X1,UBUF1
	DIRST
	 THUD
	MOVE	X1,[440700,,UBUF1]
	MOVEI	X2,42
D$IN6:	ILDB	X3,X1
	JUMPE	X3,D$IN7
	CAIL	X3,"A"
	 CAILE	X3,"Z"
	  IDPB	X2,BP
	IDPB	X3,BP
	JRST	D$IN6
D$IN7:	MOVE	X1,BP
	IDPB	X3,X1
>
; (((↑↑↑)))
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR	RENPRE
	CALLR	RENLIN
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	CAMN	IO,[ASCII/;O032/]
	 JRST	D$INP
	CAME	IO,[ASCII/+U107/]
	 JRST	D$IND
	MOVEI	FLAG,3
D$IN2:	TSOUT	<[ASCIZ/  [Password:/]>
	TSIN	(UBUF1,LBSIZE,<[ASCIZ/  [Password:/]>,NOECHO)
	 JRST	D$IN2
	TSOUT	<[ASCIZ/]/],CRLF>
	MOVE	X2,BP
	MOVEI	X1,"("
	IDPB	X1,X2
	MOVEI	X1,"'"
	IDPB	X1,X2
	MOVE	X1,[440700,,UBUF1]
	SCOPY	(X1,X2)
	MOVEI	X1,"'"
	IDPB	X1,X2
	MOVEI	X1,")"
	IDPB	X1,X2
	SETZ	X1,
	IDPB	X1,X2
	DCSOUT	<[ASCIZ/LOGIN /],ABUF,SEMI>
	CALLR	RENDER
	 CAIA
	  JRST	D$INP
	TSOUT	<[ASCIZ/   (Incorrect password)/],CRLF>
	SOJG	FLAG,D$IN2
	TSOUT	<[ASCIZ/ [Attaching]/],CRLF>
D$IND:	MOVE	X1,[440700,,[ASCIZ/%TOP.DFTP.DFTP.GUEST/]]
	MOVE	X2,[440700,,ABUF]
	SCOPY	(X1,X2)
	DCSOUT	<[ASCIZ/LOGIN %TOP.DFTP.DFTP.GUEST/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	TSOUT	<[ASCIZ/  (as DFTP.GUEST)/],CRLF>
D$INP:	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<GET"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<PUT"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<TERSE"> WRITE/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	DCSOUT	<[ASCIZ/OPEN %TOP.DFTP."<VERBOSE"> READ/],SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	MOVE	UTIL,[ASCII/%LOGI/]
	MOVEM	UTIL,CONTEX
	MOVE	UTIL,[ASCII/N/]
	MOVEM	UTIL,<CONTEX+1>
	SETZM	OPENED
	CALLR	D$CON
	ENDR
; D$CON -- CONNECT
;
D$CON:	BEGINR	<UTIL>
	CALLR	NETDSI
	DCSOUT	<[ASCIZ/CONNECT "<GET"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	CALLR	NETDSO
	DCSOUT	<[ASCIZ/CONNECT "<PUT"> /]>
	DCNOUT	<UTIL>
	DCSOUT	<SEMI>
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
; (((TENEX)))
IFG F.TENX,<
	GJINF
	MOVEM	X2,LDIR
>
; (((↑↑↑)))
	ENDR
; D$OPEN -- OPEN PROPER <FILES> IN PROPER MODE
;   IN: IO -- MODE FLAG
;			READ IF < 0
;			WRITE IF = 0
;			APPEND IF > 0
;
D$OPEN:	BEGINR
	SKIPN	OPENED
	 JRST	D$OP05
	MOVE	X1,[440700,,OPENED]
	MOVE	X2,[440700,,NBUF]
D$OP01:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	D$OP05
	JUMPN	X3,D$OP01
	CAMN	IO,OPENEM
	 RETURN	SKIP,1
	JUMPE	IO,D$OP02
	JUMPG	IO,D$OP03
	DCSOUT	<[ASCIZ/MODE "<FILES"> READ/],SEMI>
	JRST	D$OP04
D$OP02:	DCSOUT	<[ASCIZ/MODE "<FILES"> WRITE/],SEMI>
	JRST	D$OP04
D$OP03:	DCSOUT	<[ASCIZ/MODE "<FILES"> APPEND/],SEMI>
D$OP04:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVEM	IO,OPENEM
	RETURN	SKIP,1
D$OP05:	DCSOUT	<[ASCIZ/LIST /],NBUF,[ASCIZ/."<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 CAIA
	  JRST	D$OP06
	TSOUT	<[ASCIZ/ (There are no <FILES>)/],CRLF>
	RETURN
D$OP06:	SKIPN	OPENED
	 JRST	D$OP07
	DCSOUT	<[ASCIZ/CLOSE "<FILES">/],SEMI>
	SETZM	FLAGDE
	CALLR	RENDER
	 JFCL
	SETZM	OPENED
D$OP07:	JUMPE	IO,D$OP08
	JUMPG	IO,D$OP09
	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> READ/],SEMI>
	JRST	D$OP10
D$OP08:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> WRITE/],SEMI>
	JRST	D$OP10
D$OP09:	DCSOUT	<[ASCIZ/OPEN /],NBUF,[ASCIZ/."<FILES"> APPEND/],SEMI>
D$OP10:	SETOM	FLAGDE
	CALLR	RENDER
	 RETURN
	MOVE	X1,[440700,,NBUF]
	MOVE	X2,[440700,,OPENED]
	SCOPY	(X1,X2)
	MOVEM	IO,OPENEM
	ENDR	SKIP,1
; D$VER -- PRODUCE PROPER VERSION NUMBER
;   IN: IO -- DEFAULT FLAG
;			SMALLEST UNDELETED VERSION IF < 0
;			LARGEST VERSION IF = 0
;			LARGEST DELETED VERSION IF = "D"
;			LARGEST UNDELETED VERSION IF = " "
;   OUT: IO -- VERSION (IF DEFAULT)
;
D$VER:	BEGINR	<UTIL>
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPE	IO,D$VER1
	LDB	UTIL,[350700,,FBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	LDB	UTIL,[350700,,EBUF]
	CAIN	UTIL,"*"
	 SETOM	VBUF
	SKIPE	VBUF
	 RETURN	SKIP,1
	JUMPG	IO,D$VER2
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE LEAST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	LEAST=-1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (STATUS EQ ' ')/],[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF LEAST EQ -1 THEN LEAST=VERSION ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/			IF LEAST GT VERSION THEN LEAST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF LEAST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT '}' ! LEAST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	JRST	D$VERE
D$VER1:	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	GREATEST=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">/]>
	CALLR	D$WITH
	DCSOUT	<[ASCIZ/
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	COMMENT '}' ! GREATEST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	JRST	D$VERE
D$VER2:	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE GREATEST INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	GREATEST=-1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (STATUS EQ '/]>
	DCBOUT	<IO>
	SKIPN	FLAGDD
	 JRST	D$VER$
	TBOUT	<IO>
D$VER$:	DCSOUT	<[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		IF GREATEST LT VERSION THEN GREATEST=VERSION
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	END
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF GREATEST EQ -1 THEN ERROR 'NO SUCH FILE' ELSE
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		COMMENT '}' ! GREATEST
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
D$VERE:	MOVE	IO,[ASCII/;A282/]
	CALLR	RENFIP
	 RETURN
D$VERN:	DCBIN	<IO>
	CAIE	IO,"}"
	 JRST	D$VERN
	CALLR	DCNIN
	MOVEM	IO,VBUF
	CALLR	RENLIN
	CALLR	RENDER
	 RETURN
	ENDR	SKIP,1
; D$VEX -- VERIFY THAT VERSION EXISTS
;
D$VEX:	BEGINR	<IO>
	SETOM	FLAGDE
	DCSOUT	<[ASCIZ/BEGIN
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	DECLARE EXTANT INT
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	EXTANT=0
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	FOR "<FILES">
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	  WITH (FILENAME EQ '/],FBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	    AND (EXTENSION EQ '/],EBUF,[ASCIZ/')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	      AND (VERSION EQ /]>
	MOVE	IO,VBUF
	DCNOUT	<IO>
	DCSOUT	<RPAREN>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/		AND (STATUS EQ ' ')
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/			EXTANT=EXTANT+1
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/	IF EXTANT NE 1 THEN ERROR 'NO SUCH FILE'
/]>
	CALLR	RENDER
	 RETURN
	DCSOUT	<[ASCIZ/END/],SEMI>
	CALLR	RENDER
	 RETURN
	ENDR	SKIP,1
; D$WITH -- GENERATE A QUALIFIED WITH CLAUSE (CONSIDER *'S)
;   IN: IO -- POINTER TO FIXED QUALIFIER (OR 0)
;   FLAGS:
	D$W$F==400000
	D$W$E==200000
	D$W$V==100000
	D$W$Q==010000
;
D$WITH:	BEGINR	<UTIL,FLAG>
	SETZ	FLAG,
	LDB	UTIL,[350700,,FBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$F
	LDB	UTIL,[350700,,EBUF]
	CAIE	UTIL,"*"
	 TRO	FLAG,D$W$E
	SKIPLE	VBUF
	 TRO	FLAG,D$W$V
	SKIPE	IO
	 TRO	FLAG,D$W$Q
	JUMPE	FLAG,RETN(0)
	DCSOUT	<[ASCIZ/ WITH/]>
	TRNN	FLAG,D$W$F
	 JRST	D$WIT1
	DCSOUT	<[ASCIZ/ FILENAME EQ '/],FBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$E!D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT1:	TRNN	FLAG,D$W$E
	 JRST	D$WIT2
	DCSOUT	<[ASCIZ/ EXTENSION EQ '/],EBUF,[ASCIZ/'/]>
	TRNN	FLAG,D$W$V!D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT2:	TRNN	FLAG,D$W$V
	 JRST	D$WIT3
	DCSOUT	<[ASCIZ/ VERSION EQ /]>
	MOVE	UTIL,VBUF
	DCNOUT	<UTIL>
	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<[ASCIZ/ AND/]>
D$WIT3:	TRNN	FLAG,D$W$Q
	 RETURN
	DCSOUT	<(IO)>
	ENDR
; NETSUM -- NETWORK CHECKSUM VERIFICATION
;
NETSUM:	BEGINR	<IO,FLAG>
	CALLR	RENPRE
	CAME	IO,[ASCII/;I275/]
	 JRST	NETS2
	SETZ	FLAG,
NETS1:	DCBIN	<IO>
	CAIE	IO,"="
	 JRST	NETS1
	SKIPN	FLAG
	 SOJA	FLAG,NETS1
	CALLR	DCNIN
	CAME	IO,NSUM
	 JRST	NETS3
	CALLR	RENLIN
	RETURN
NETS2:	CALLR	RENLIP
	RETURN
NETS3:	CALLR	RENLIN
	TSOUT	<[ASCIZ/ (Network Checksum Error)/],CRLF>
	ENDR

; NETRAT -- CALCULATE AND PRINT RATE
;
NETRAT:	BEGINR	<IO,<IO+1>>
	TSOUT	<[ASCIZ/ (/]>
	MOVEI	IO,↑D36
	IMULB	IO,NSIZE
	IDIV	IO,NTIME
	TNOUT	<IO>
	TSOUT	<[ASCIZ/ Baud (/]>
	MOVE	IO,NSIZE
	TNOUT	<IO>
	TSOUT	<[ASCIZ/ bits in /]>
	SKIPN	IO,NTIME
	 MOVEI	IO,1
	TNOUT	<IO>
	HRRZI	<IO+1>,[ASCIZ/ seconds))/]
	CAIN	IO,1
	 HRRZI	<IO+1>,[ASCIZ/ second))/]
	TSOUT	<(IO+1),CRLF>
	ENDR
; RENDER -- REQUEST ENDER (ASSUMES INITIAL RENLIN)
;
RENDER:	BEGINR	<IO,UTIL,FLAG>
	SETZ	FLAG,
RENDSL:	CALLR	RENPRE
	CAMN	IO,[ASCII/.I220/]
	 JRST	RENDES
	CAMN	IO,[ASCII/.I210/]
	 JRST	RENDRR
	CAME	IO,[ASCII/;A282/]
	 CAMN	IO,[ASCII/.J151/]
	  JRST	RENDPM
	LDB	UTIL,[350700,,IO]
	CAIE	UTIL,"+"
	 CAIN	UTIL,"-"
	  CAIA
	   JRST	RENDFL
	SETO	FLAG,
	SKIPN	FLAGDE
	 JRST	RENDFL
	SETZM	FLAGDE
RENDPM:	CALLR	RENLIP
	JRST	RENDSL
RENDFL:	CALLR	RENLIN
	JRST	RENDSL
RENDES:	CALLR	RENLIN
	MOVEI	IO,"L"-100
	DCBOUT	<IO>
	SETO	FLAG,
	JRST	RENDSL
RENDRR:	CALLR	RENLIN
	JUMPN	FLAG,RETN(0)
	ENDR	SKIP,1

; RENFIP -- FIND PREFIX (ASSUMES INITIAL RENLIN)
;   IN: IO -- PREFIX
;
RENFIP:	BEGINR	<BP,UTIL,FLAG>
	MOVE	FLAG,IO
	SETZ	UTIL,
RENFIL:	CALLR	RENPRE
	CAMN	IO,FLAG
	 RETURN	SKIP,1
	LDB	BP,[350700,,IO]
	CAIE	BP,";"
	 CAIN	BP,"."
	  JRST	RENFIN
	SKIPN	UTIL
	 CALLR	RENLIP
	SKIPE	UTIL
	 CALLR	RENLIN
	AOJA	UTIL,RENFIL
RENFIN:	CALLR	RENLIN
	CAMN	IO,[ASCII/.I220/]
	 JRST	RENFIS
	CAMN	IO,[ASCII/.I210/]
	 RETURN
	JRST	RENFIL
RENFIS:	MOVEI	IO,"L"-100
	DCBOUT	<IO>
	SETZM	FLAGDE
	CALLR	RENDER
	 RETURN
	ENDR

; RENLIN -- REQUEST END: PROCEED TO NEW LINE
;
RENLIN:	BEGINR	<IO>
RENLNL:	DCBIN	<IO>
	CAIE	IO,12
	 JRST	RENLNL
	ENDR

; RENLIP -- REQUEST END: PROCEED TO NEW LINE, PRINT MESSAGE
;
RENLIP:	BEGINR	<IO>
	SKIPN	FLAGDD
	 JRST	RENLPF
RENLPL:	DCBIN	<IO>
	CAIE	IO,12
	 JRST	RENLPL
	RETURN
RENLPF:	DCBIN	<IO>
	CAIN	IO,12
	 RETURN
	CAIE	IO,11
	 JRST	RENLPF
	MOVEI	IO," "
	TBOUT	<IO>
	MOVEI	IO,"("
RENLPP:	TBOUT	<IO>
RENLPQ:	DCBIN	<IO>
	CAIN	IO,42
	 JRST	RENLPQ
	CAIE	IO,15
	 JRST	RENLPP
	DCBIN	<IO>
	MOVEI	IO,")"
	TBOUT	<IO>
	TSOUT	<CRLF>
	ENDR

; RENPRE -- REQUEST END: RETURN ERROR PREFIX (ASSUMES RENLIN)
;   OUT: IO -- ASCII PREFIX (5 BYTES)
;
RENPRE:	BEGINR	<BP,UTIL,FLAG>
RENPRP:	SETZ	IO,
	MOVE	BP,[440700,,IO]
	MOVEI	FLAG,5
RENPRL:	DCBIN	<UTIL>
	CAIE	UTIL,15
	 CAIN	UTIL,12
	  JRST	RENPRL
	IDPB	UTIL,BP
	SOJG	FLAG,RENPRL
	LDB	UTIL,[350700,,IO]
	CAIN	UTIL,"?"
	 JRST	DEATH
	CAIE	UTIL,"!"
	 RETURN
	SKIPN	FLAGNN
	 CALLR	RENLIP
	JRST	RENPRP
	ENDR
; DEATH -- FATAL DATACOMPUTER ERROR (? MESSAGE)
;
DEATH:	CALLR	RENLIP
	TSOUT	<[ASCIZ/ ?? Fatal Datacomputer Error ??/],CRLF>
; (((ITS)))
IFL F.TENX,<
	.VALUE
	.BREAK 16,160000
>
; (((TOPS-10)))
IFE F.TENX,<
	EXIT
>
; (((↑↑↑)))
; (((TENEX)))
IFG F.TENX,<
	HALTF
	JRST	.-1
>
; (((↑↑↑)))
	SUBTTL I/O Routines
PRINTX (I/O routines)

; TAIN -- TERMINAL AUTHORIZATION INPUT
;   IN: X1 -- POINTER TO CONFIRMATION MESSAGE
;
$TAIN$:	BEGINR	<IO>
TAIN1:	MOVEI	IO,(X1)
	TSOUT	<(IO)>
TAIN5:	TBIN	<IO>
	CAIN	IO,15
	 JRST	TAIN5
	CAIN	IO,"R"-100
	 JRST	TAIN1
	CAIN	IO,"N"
	 JRST	TAIN2
	CAIN	IO,"Y"
	 JRST	TAIN3
	CAIE	IO,12
	 CAIN	IO,33
	  JRST	TAIN4
	CAIE	IO,37
	 CAIN	IO," "
	  JRST	TAIN4
	TSOUT	<[ASCIZ/XXX/],CRLF>
	RETURN
TAIN2:	TSOUT	<[ASCIZ/No/],CRLF>
	RETURN	SKIP,1
TAIN3:	TSOUT	<[ASCIZ/Yes/]>
TAIN4:	TSOUT	<CRLF>
	ENDR	SKIP,2
; TERMINAL COMMAND INPUT ROUTINE
;
;   WHEN ENOUGH OF A COMMAND IS RECEIVED TO UNIQUELY IDENTIFY IT,
;     INPUT NOT CONFORMING TO THE REST OF THE COMMAND IS NOT ACCEPTED.
;   IF THE COMMAND IS UNIQUELY IDENTIFIED, AN ALTMODE, CARRIAGE RETURN,
;     LINE FEED, EOL, OR SPACE WILL FINISH IT.
;     IF NOT, SUCH CHARACTERS WILL BE REJECTED.
;   ↑A AND RUBOUT DELETE THE LAST CHARACTER, ↑R RETYPES THE INPUT LINE,
;     ↑X AND ↑U DELETE THE LINE (RETURN TCIO=-1).
;
;	IN: TCIO -- POINTER TO ↑R TEXT,,POINTER TO CONTROL BLOCK
;			POINTER TO COMMAND STRING LIST
;			NUMBER OF COMMANDS
;			NUMBER OF CHARACTERS IN LARGEST COMMAND STRING
;			NUMBER OF WORDS IN LARGEST COMMAND STRING
;			<VALUE LIST>
;			<COMMAND STRING LIST>
;	OUT: TCIO -- LAST CHAR INPUT
;	     FLAG -- COMMAND VALUE
;	RETURNS: SKIP,0 -- DELETE LINE
;		 SKIP,1 -- NULL COMMAND
;		 SKIP,2 -- COMMAND RECOGNIZED
;
$TCIN$:	BEGINR	<TCIBP,TCIACB,TCITLP,TCITCC,TCIPBP,TCIPCC,TCISBP,TCISCC,TCIMAC,TCIMAN,UTIL>
	MOVE	TCIACB,TCIO
	SETZ	UTIL,
TCII01:	MOVEM	UTIL,TCIPCL(UTIL)
	ADDI	UTIL,1
	CAME	UTIL,1(TCIACB)
	 JRST	TCII01
	ADDI	UTIL,TCIPCL
	MOVEM	UTIL,TCIPNF
	HRRI	UTIL,TCIPCL
	HRL	UTIL,1(TCIACB)
	MOVEM	UTIL,TCIPLP
	MOVE	TCIBP,[440700,,ABUF]
	HRLI	TCISBP,350700
	HRR	TCISBP,(TCIACB)
	SETZ	TCISCC,
TCICHR:	TBIN	<TCIO>
	CAIN	TCIO,"R"-100
	 JRST	TCIREP
	CAIN	TCIO,"?"
	 JRST	TCIQUA
	CAIE	TCIO,177
	 CAIN	TCIO,"A"-100
	  JRST	TCIDEL
	CAIE	TCIO,"U"-100
	 CAIN	TCIO,"X"-100
	  JRST	TCIENR
	CAIN	TCIO,15
	 JRST	TCICHR
	CAIE	TCIO,12
	 CAIN	TCIO,37
	  JRST	TCIC01
	CAIE	TCIO," "
	 CAIN	TCIO,33
	  JRST	TCIC01
	CAIG	TCIO," "
	 JRST	TCIBAD
	JRST	TCIC02
TCIC01:	JUMPE	TCISCC,TCIENN
	HLRZ	UTIL,TCIPLP(TCISCC)
	CAIN	UTIL,1		; OK IF JUST ONE POSSIBILITY
	 JRST	TCIEND
TCIC02:	SETZ	TCIPCC,
	MOVE	TCIPBP,TCISBP
	MOVE	UTIL,TCIPNF
	MOVEM	UTIL,<TCIPLP+1>(TCISCC)
	SETZ	TCIMAC,
	HRRZI	TCIMAN,-1
TCIC03:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC04
	CAIE	UTIL,(TCIO)
	 JRST	TCIC08
TCIC04:	HLRZ	TCITCC,TCIPLP(TCISCC)
	HRRZ	TCITLP,TCIPLP(TCISCC)
TCIC05:	MOVE	UTIL,(TCITLP)
	CAIN	UTIL,(TCIPCC)
	 JRST	TCIC06
	AOJ	TCITLP,
	SOJG	TCITCC,TCIC05
	JRST	TCIC08
TCIC06:	LDB	UTIL,TCIPBP
	JUMPE	UTIL,TCIC07
	MOVEM	TCIPCC,@TCIPNF
	AOS	TCIPNF
	AOJA	TCIMAC,TCIC08
TCIC07:	CAIN	TCIMAN,-1
	 SETO	TCIMAN,
	CAIE	TCIMAN,-1
	 HRRZI	TCIMAN,(TCIPCC)
TCIC08:	ADD	TCIPBP,3(TCIACB)
	AOJ	TCIPCC,
	CAME	TCIPCC,1(TCIACB)
	 JRST	TCIC03
	CAIE	TCIO,12
	 CAIN	TCIO,37
	  JRST	TCIC09
	CAIN	TCIO," "
	 JRST	TCIC09
	CAIE	TCIO,33
	 JRST	TCIC10
TCIC09:	JUMPL	TCIMAN,TCIBAD
	CAIN	TCIMAN,-1
	 JRST	TCIBAD
	JRST	TCIEND
TCIC10:	JUMPE	TCIMAC,TCIBAD
	AOJ	TCISCC,
	HRLM	TCIMAC,TCIPLP(TCISCC)
	IBP	TCISBP
	IDPB	TCIO,TCIBP
	TBOUT	<TCIO>		; ECHO
	JRST	TCICHR
TCIBAD:	MOVEI	TCIO,"G"-100
	TBOUT	<TCIO>
	JRST	TCICHR
TCIREP:	TSOUT	<CRLF>
	HLRZ	UTIL,TCIACB
	TSOUT	<(UTIL)>
	HRRZI	TCIPCC,(TCISCC)	; OUTPUT LOOP CONTROL = CHARS SO FAR
	MOVE	TCIPBP,[440700,,ABUF]
TCIR01:	SOJL	TCIPCC,TCICHR
	ILDB	TCIO,TCIPBP
	TBOUT	<TCIO>
	JRST	TCIR01
TCIQUA:	TBOUT	<TCIO>		; PRINT "?"
	HLRZ	TCIPCC,TCIPLP(TCISCC) ; PRINT THE POSSIBLE COMMAND LIST
	HRRZ	TCIPBP,TCIPLP(TCISCC)
TCIQ01:	TSOUT	<CRLF>
	MOVEI	TCIO,11
	TBOUT	<TCIO>
	MOVE	TCITCC,2(TCIACB)
	MOVE	TCITLP,(TCIPBP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,440700
TCIQ02:	ILDB	TCIO,TCITLP
	JUMPE	TCIO,TCIQ03
	TBOUT	<TCIO>
	SOJG	TCITCC,TCIQ02
TCIQ03:	AOJ	TCIPBP,
	SOJG	TCIPCC,TCIQ01
	JRST	TCIREP
TCIDEL:	JUMPLE	TCISCC,TCIENR	; THERE'S NO CHARACTER TO DELETE
	MOVEI	TCIO,"\"
	TBOUT	<TCIO>
	LDB	TCIO,TCIBP
	TBOUT	<TCIO>
	ADD TCIBP,[070000,,0]		; BACK UP LINE BYTE PTR
	TLNE TCIBP,400000
	 SUB TCIBP,[430000,,1]
	HRRZ	UTIL,TCIPLP(TCISCC) ; RESET TCIPNF
	MOVEM	UTIL,TCIPNF
	ADD TCISBP,[070000,,0]		; BACK UP SCAN BYTE PTR
	TLNE TCISBP,400000
	 SUB TCISBP,[430000,,1]
	SOJA	TCISCC,TCICHR
TCIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETZ	FLAG,
	RETURN
TCIENN:	SETZ	FLAG,
	RETURN	SKIP,1
TCIEND:	MOVE	TCITLP,TCIPLP(TCISCC) ; COMMAND NUMBER
	MOVE	TCITLP,(TCITLP)
	IMUL	TCITLP,3(TCIACB)
	ADD	TCITLP,(TCIACB)
	HRLI	TCITLP,440700
	SETZ	TCITCC,
TCIE01:	IBP	TCITLP
	AOJ	TCITCC,
	CAIE	TCITCC,(TCISCC)
	 JRST	TCIE01
TCIE02:	AOJ	TCITCC,
	CAMLE	TCITCC,2(TCIACB)
	 JRST	TCIE03
	ILDB	TCIMAC,TCITLP
	JUMPE	TCIMAC,TCIE03
	TBOUT	<TCIMAC>
	JRST	TCIE02
TCIE03:	MOVE	TCITLP,TCIPLP(TCISCC)
	MOVE	FLAG,(TCITLP)
	ADDI	FLAG,4(TCIACB)
	MOVE	FLAG,(FLAG)
	ENDR	SKIP,2
; TERMINAL STRING INPUT
;   IN: IO -- POINTER TO BUFFER,,SIZE OF BUFFER
;	UTIL -- ECHO FLAG (0 IF ECHO),,POINTER TO ↑R TEXT
;   OUT: IO -- LAST CHARACTER INPUT (-1 IF DELETE LINE)
;        UTIL -- COUNT OF CHARACTERS
;
$TSIN$:	BEGINR	<BP,R10,R11,R12>
	MOVE	R10,IO
	MOVE	R11,UTIL
	HLRZ	BP,IO
	HRLI	BP,440700
	SETZ	UTIL,
TSICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	TSIREP
	CAIE	IO,177
	 CAIN	IO,"A"-100
	  JRST	TSIDEL
	CAIE	IO,"U"-100
	 CAIN	IO,"X"-100
	  JRST	TSIENR
	CAIN	IO,15
	 JRST	TSICHR
	CAIE	IO,12
	 CAIN	IO,33
	  JRST	TSIEND
	CAIN	IO,37
	 JRST	TSIEND
	CAIL	IO," "
	 CAIL	UTIL,(R10)
	  JRST	TSIBAD
	IDPB	IO,BP
	ADDI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IO>
	JRST	TSICHR
TSIBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	TSICHR
TSIREP:	TSOUT	<CRLF>
	TSOUT	<(R11)>
	JUMPL	R11,TSICHR
	HRRZI	IO,(BP)
	HLR	R12,R10
	CAIGE	IO,(R12)
	 JRST	TSICHR
	HRLI	R12,440700
TSIR01:	CAMN	R12,BP
	 JRST	TSICHR
	ILDB	IO,R12
	TBOUT	<IO>
	JRST	TSIR01
TSIDEL:	JUMPE	UTIL,TSIENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	SUBI	UTIL,1
	JUMPL	R11,TSICHR
	TBOUT	<IO>
	JRST	TSICHR
TSIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETO	IO,
	SETZ	UTIL,
	RETURN
TSIEND:	SETZ	R12,
	IDPB	R12,BP
	ENDR	SKIP,1
; TERMINAL NUMBER INPUT
;   IN: IO -- POINTER TO ↑R TEXT,,RADIX
;   OUT: IO -- NUMBER
;
$TNIN$:	BEGINR	<BP,UTIL,FLAG>
	MOVE	UTIL,IO
	MOVE	BP,[440700,,UBUF1]
	SETZ	FLAG,
TNICHR:	TBIN	<IO>
	CAIN	IO,"R"-100
	 JRST	TNIREP
	CAIE	IO,177
	 CAIN	IO,"A"-100
	  JRST	TNIDEL
	CAIE	IO,"U"-100
	 CAIN	IO,"X"-100
	  JRST	TNIENR
	CAIN	IO,15
	 JRST	TNICHR
	CAIE	IO,12
	 CAIN	IO,33
	  JRST	TNIEND
	CAIE	IO,37
	 CAIN	IO," "
	  JRST	TNIEND
	CAIL	IO,"0"
	 CAIL	IO,"0"(UTIL)
	  JRST	TNIBAD
	CAILE	FLAG,12		; MAXIMUM # OF DIGITS WITHOUT OVERFLOW
	 JRST	TNIBAD
	IDPB	IO,BP
	TBOUT	<IO>
	AOJA	FLAG,TNICHR
TNIBAD:	MOVEI	IO,"G"-100
	TBOUT	<IO>
	JRST	TNICHR
TNIREP:	TSOUT	<CRLF>
	HLRZ	IO,UTIL
	TSOUT	<(IO)>
	HRRZI	IO,(BP)
	CAIGE	IO,UBUF1
	 JRST	TNICHR
	MOVE	IO,[440700,,UBUF1]
TNIR01:	CAMN	IO,BP
	 JRST	TNICHR
	ILDB	X1,IO
	TBOUT	<X1>
	JRST	TNIR01
TNIDEL:	JUMPE	FLAG,TNIENR
	MOVEI	IO,"\"
	TBOUT	<IO>
	LDB	IO,BP
	ADD BP,[70000,,0]
	TLNE BP,400000
	 SUB BP,[430000,,1]
	TBOUT	<IO>
	SOJA	FLAG,TNICHR
TNIENR:	TSOUT	<[ASCIZ/XXX/],CRLF>
	SETZ	IO,
	RETURN
TNIEND:	SETZ	IO,
	IDPB	IO,BP
	MOVE	BP,[440700,,UBUF1]
	MOVEI	FLAG,(UTIL)
TNICAL:	ILDB	UTIL,BP
	JUMPE	UTIL,RETN(1)
	IMULI	IO,(FLAG)
	SUBI	UTIL,"0"
	ADDI	IO,(UTIL)
	JRST	TNICAL
	ENDR
; DCNIN -- DATACOMPUTER NUMBER INPUT
;   OUT: IO -- 36-BIT MAGNITUDE INTEGER
;
DCNIN:	BEGINR	<<IO+1>,UTIL>
	SETZ	IO,
DCNIN1:	DCBIN	<UTIL>
	CAIL	UTIL,"0"
	 CAILE	UTIL,"9"
	  RETURN
	JUMPL	IO,DCNIN2
	MULI	IO,↑D10
	CAILE	IO,1
	 JRST	DCNIN2
	CAIN	IO,1
	 TLO	<IO+1>,400000
	MOVE	IO,<IO+1>
	ADDI	IO,-"0"(UTIL)
	JRST	DCNIN1
DCNIN2:	SETO	IO,
	JRST	DCNIN1
	ENDR
; $NOUT$ -- INTEGER OUTPUT
;   IN: X1 -- INTEGER
;       X2 -- T-DC FLAG (0=T,-1=DC),,RADIX
;
$NOUT$:	BEGINR	<FLAG>
	MOVE	FLAG,X2
	MOVE	X3,[440700,,UBUF1]
	MOVEI	X4,1
	JUMPGE	X1,NOUT1
	LSHC	X1,-↑D35
	LSH	X2,-1
	DIVI	X1,(FLAG)
	CAIA
NOUT1:	 IDIVI	X1,(FLAG)
	ADDI	X2,"0"
	IDPB	X2,X3
	SKIPE	X1
	 AOJA	X4,NOUT1
	SKIPA	X1,[440700,,UBUF2]
NOUT2:	ADD	X3,[070000,,0]
	TLNE	X3,400000
	 SUB	X3,[430000,,1]
	LDB	X2,X3
	IDPB	X2,X1
	SOJG	X4,NOUT2
	IDPB	X4,X1
	SKIPL	FLAG
	 JRST	NOUT3
	DCSOUT	<UBUF2>
	RETURN
NOUT3:	TSOUT	<UBUF2>
	ENDR
	SUBTTL System Dependent Routines for ITS
PRINTX (system-dependent routines)

; (((ITS)))
IFL F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	.OPEN TTI,[.UAI,,'TTY']		; TTY input
	 THUD
	.OPEN TTO,[.UAO,,'TTY']		; TTY output
	 THUD
	TSOUT <[ASCIZ/Welcome to the wonderful world of DFTP./],CRLF>
	.SUSET [.RSNAME,,LCLSNM]
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVEI
		[('DSK')]
		['.FILE.']
		['(DIR) ']
		SETZ LCLSNM]
	 JRST [	TSOUT <[ASCIZ/Non-existant local directory./]>
		.BREAK 16,160000]
	.CLOSE
	.CALL [	SETZ
		SIXBIT/TTYSET/
		MOVEI TTI
		MOVE [030303,,030303]
		SETZ [030303,,030303]]
	 JRST [	TSOUT <[ASCIZ/Warning -- Device TTY is not a console!/],CRLF>
		JRST .+1]
	.CALL [	SETZ			; host number
		SIXBIT/NETHST/
		MOVEI -1
		MOVEM
		SETZM LHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .UII!40050	; OPEN on gensymmed socket, 32 bits
		MOVEI ICP
		[('NET')]		; network device
		[-1]			; initial local socket is gensymmed
		MOVEI DCSOKT		; initial foreign socket(DATACOMPUTER)
		SETZI DCHOST]		; foreign host(CCA)
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI ICP
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	MOVE X1,[ICP,,RCHBLK]
	.RCHST X1,			; get status of network channel
	HRRE X1,RCHBLK+4		; get status of network
	JUMPL X1,NETDED			; network dead if .LE. 0
	CAIN X1,%NSCLI			; CLS w/ input?
	 JRST ICPWIN
	CAIE X1,%NSINP			; input available?
	 CAIN X1,%NSOPN			; connection open?
	  JRST ICPWIN
	JUMPN X1,[THUD]			; any other condition is lossage
ICPCLS:	TSOUT <[ASCIZ/Cannot establish network connection/]>
	.BREAK 16,160000
NETDED:	TSOUT <[ASCIZ/ARPAnet is down/]>
	.BREAK 16,160000
ICPWIN:	MOVE X1,RCHBLK+1		; get gensymmed local socket
	ADDI X1,2			; receive
	MOVEM X1,LCLRCV
	ADDI X1,1			; transmit
	MOVEM X1,LCLTRN
	.IOT ICP,X1			; get foreign place's socket
	.CLOSE ICP,			; free up ICP socket right away
	MOVEM X1,FORRCV			; receive
	ADDI X1,1			; socket to me!
	MOVEM X1,FORTRN
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAI
		MOVEI DCI		; DATACOMPUTER input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI 40!.UAO
		MOVEI DCO		; DATACOMPUTER output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 JRST ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCI
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DCO
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	MOVEI X1,2			; offset for data sockets
	ADDM X1,LCLRCV
	ADDM X1,LCLTRN
	ADDM X1,FORRCV
	ADDM X1,FORTRN
	ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	.IOT DCO,["Z"-100]		; SEND QUIT
QUIT1:	DCBIN <IO>
	JRST QUIT1
QUIT2:	.CLOSE DCI,
	.CLOSE DCO,
	.BREAK 16,160000

; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI DDI		; DATACOMPUTER data input
		[('NET')]
		LCLRCV
		FORTRN
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDI
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	RETURN SKIP,1
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI DDO		; DATACOMPUTER data output
		[('NET')]
		LCLTRN
		FORRCV
		SETZI DCHOST]
	 THUD
	.CALL [	SETZ
		SIXBIT/NETBLK/
		MOVEI DDO
		MOVEI %NSRFS
		SETZM X1]		; wait for connection
	 THUD
	JUMPE X1,ICPCLS
	RETURN SKIP,1
	ENDR

; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	.CLOSE DDI,
	.CLOSE DDO,
	ENDR

; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;
NETDSI:	BEGINR
	MOVE UTIL,LCLRCV
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;
NETDSO:	BEGINR
	MOVE UTIL,LCLTRN
	ENDR
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI LCI
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCOI1
	RETURN SKIP,1
LOCOI1:	TSOUT <[ASCIZ/ (Local file not found)/],CRLF>
	ENDR

;LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BIO
		MOVEI LCO
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 THUD
	.CALL [	SETZ
		SIXBIT/SFDATE/
		MOVEI LCO
		SETZ LCLDAT]
	 THUD
	RETURN SKIP,1
	ENDR

; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	.CLOSE LCI,
	.CLOSE LCO,
	ENDR

; LOCS -- LOCAL FILE (SIZE)
;
LOCS:	BEGINR
	.CALL [	SETZ
		SIXBIT/FILLEN/
		MOVEI LCI
		SETZM IO]
	 SETZ IO,			; it should not crap out
	ENDR
; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
;   IN: IO -- ADDRESS OF TIME STRING
;  OUT:	UTIL -- ITS DISK FORMAT DATE/TIME
;
LUTTSN:	BEGINR <BP>
	SETZ UTIL,
	ILDB X1,IO
	CAIL X1,"0"
	 CAILE X1,"9"
	  RETURN
	SUBI X1,"0"
	IMULI X1,↑D10
	ILDB X2,IO
	CAIL X2,"0"
	 CAILE X2,"9"
	  RETURN
	ADDI X1,-"0"(X2)
	ILDB X2,IO
	CAIE X2,"-"
	 RETURN
	MOVE X2,[440700,,X3]
	SETZ X3,
REPEAT 3,<
	ILDB X4,IO
	IDPB X4,X2
>
	MOVEI X2,↑D12
	IOR X3,[1004,,0]	; CANONICALIZE CASES
	CAME X3,LUTTM-1(X2)
	 SOJG X2,.-1
	JUMPL X2,RETN(0)
	ILDB X3,IO
	CAIE X3,"-"
	 RETURN
	ILDB X3,IO
	CAIL X3,"0"
	 CAILE X3,"9"
	  RETURN
	SUBI X3,"0"
	IMULI X3,↑D10
	ILDB X4,IO
	CAIL X4,"0"
	 CAILE X4,"9"
	  RETURN
	ADDI X3,-"0"(X4)
	DPB X3,[330700,,UTIL]
	DPB X2,[270400,,UTIL]
	DPB X1,[220500,,UTIL]
	ILDB X1,IO
	CAIE X1," "
	 RETURN
	ILDB X1,IO
	SUBI X1,"0"
	IMULI X1,↑D10
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,6
	ILDB X2,IO
	CAIE X2,":"
	 RETURN
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,↑D10
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,6
	ILDB X2,IO
	CAIE X2,":"
	 JRST [	IMULI X1,↑D20
		JRST LUTSN1]
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	IMULI X1,↑D10
	ILDB X2,IO
	ADDI X1,-"0"(X2)
	LSH X1,1
LUTSN1:	ADDI UTIL,(X1)
	ENDR
; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
;   IN:	UTIL -- ITS DISK FORMAT DATE/TIME
;	BP -- BYTE POINTER TO DESTINATION STRING
;  OUT:	BP -- UPDATED BYTE POINTER
;
LUTTNS:	BEGINR
	LDB X3,[220500,,UTIL]	; DAY
	IDIVI X3,↑D10
	ADDI X3,"0"
	ADDI X4,"0"
	IDPB X3,BP
	IDPB X4,BP
	MOVEI X3,"-"
	IDPB X3,BP
	LDB X3,[270400,,UTIL]	; MONTH
	HRRI X3,LUTTM-1(X3)
	HRLI X3,440700
	SCOPY (X3,BP)
	MOVEI X3,"-"
	IDPB X3,BP
	LDB X3,[330700,,UTIL]	; YEAR
	IDIVI X3,↑D10
	ADDI X3,"0"
	ADDI X4,"0"
	IDPB X3,BP
	IDPB X4,BP
	MOVEI X3," "
	IDPB X3,BP
	HRRZ X2,UTIL		; TIME IN SECONDS
	LSH X2,-1
	IDIVI X2,↑D3600
	MOVEI X4,(X3)
	IDIVI X2,↑D10
	ADDI X2,"0"
	ADDI X3,"0"
	IDPB X2,BP
	IDPB X3,BP
	MOVEI X2,":"
	IDPB X2,BP
	MOVEI X2,(X4)
	IDIVI X2,↑D60
	MOVEI X4,(X3)
	IDIVI X2,↑D10
	ADDI X2,"0"
	ADDI X3,"0"
	IDPB X2,BP
	IDPB X3,BP
	MOVEI X2,":"
	IDPB X2,BP
	MOVEI X2,(X4)
	IDIVI X2,↑D10
	ADDI X2,"0"
	ADDI X3,"0"
	IDPB X2,BP
	IDPB X3,BP
	SETZ X2,
	IDPB X2,BP
	ENDR				; return

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM:	ASCII/Jan/
	ASCII/Feb/
	ASCII/Mar/
	ASCII/Apr/
	ASCII/May/
	ASCII/Jun/
	ASCII/Jul/
	ASCII/Aug/
	ASCII/Sep/
	ASCII/Oct/
	ASCII/Nov/
	ASCII/Dec/
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR <IO>
	SETZM LCLFN1			; < prevent assembly error
	MOVSI X1,'>  '
	MOVEM X1,LCLFN2
	HRLI IO,440700
LUTFN1:	CALLR LUTWRD			; get a SIXBIT word
	MOVEM X1,LCLFN1
	JUMPE X2,RETN(0)
	CAIE X2,"."
	 JRST LUTFN1
	CALLR LUTWRD
	CAIE X1,
	 MOVEM X1,LCLFN2		; use FN2 if specified
	ENDR

; LUTWRD -- LOCAL UTILITY: GET A SIXBIT WORD IN X1, DELIMITER IN X2
;
LUTWRD:	BEGINR <BP>
	SETZ X1,			; initialize word, word pointer
	MOVE BP,[440600,,X1]
LUTWR1:	ILDB X2,IO			; get a character from buffer
	CAIN X2,"."
	 JRST RETN(0)
	JUMPE X2,RETN(0)
	SUBI X2," "			; SIXBITify from ASCII
	TRNN X1,77			; and save in word until word filled
	 IDPB X2,BP
	JRST LUTWR1
	ENDR
; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI:	BEGINR
	SETZM FFITYP
	SETO X1,
	CAME X1,FSBUF
	 CAMN X1,ESBUF
	  CAIA
	   JRST NETFI1
	.IOT TTO,[" "]
	.IOT TTO,["("]
	SETOM FFITYP
NETFI1:	MOVE X1,[440600,,LCLFN1]
	MOVEI X2,6
	MOVE X3,[440700,,FBUF]
NETFI4:	ILDB X4,X1
	JUMPE X4,NETFI5
	ADDI X4," "
	SKIPE FFITYP
	 .IOT TTO,X4
NETFI5:	SKIPE GBUF1
	 IDPB X4,X3
	SOJG X2,NETFI4
NETFI2:	SKIPE FFITYP
	 .IOT TTO,["."]
	MOVE X1,[440600,,LCLFN2]
	MOVEI X2,6
	MOVE X3,[440700,,EBUF]
NETFI6:	ILDB X4,X1
	JUMPE X4,NETFI7
	ADDI X4," "
	SKIPE FFITYP
	 .IOT TTO,X4
NETFI7:	SKIPE GBUF2
	 IDPB X4,X3
	SOJG X2,NETFI6
NETFI3:	SKIPN FFITYP
	 RETURN
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR <IO,BP,UTIL>
	SETZM IOBUFR
	MOVE X1,[IOBUFR,,IOBUFR+1]
	BLT X1,IOBUFR+1777
	.RDTIM X1,
	IDIVI X1,↑D30
	MOVEM X1,NTIME
	MOVE BP,[440700,,IOBUFR]
	MOVE UTIL,[440700,,FBUF]
	SCOPY (UTIL,BP)
	MOVE BP,UTIL
	MOVE UTIL,[440700,,EBUF]
	SCOPY (UTIL,BP)
	MOVE BP,UTIL
	.CALL [	SETZ
		SIXBIT/RFDATE/
		MOVEI LCI
		SETZM UTIL]
	 MOVSI UTIL,124201
	CALLR LUTTNS
	.CALL [	SETZ
		SIXBIT/RQDATE/
		SETZM UTIL]
	 MOVSI UTIL,124201
	CALLR LUTTNS
	HRLI BP,004400
	MOVE UTIL,VBUF
	IDPB UTIL,BP
	CALLR LOCS
	IDPB IO,BP
	MOVNI UTIL,17
	IDPB UTIL,BP
	SUBI BP,IOBUFR-1
	HRRZM BP,NSIZE
	HRLOI BP,-1(BP)
	EQVI BP,IOBUFR
	MOVEM BP,X1SAVE#
	SETZ UTIL,
	ADD UTIL,(BP)
	AOBJN BP,.-1
	ADDM UTIL,NSUM
	CALLR NETMSG
	 JRST DEATH
	MOVE X1,X1SAVE#
	.IOT DDO,X1
	ENDR
; PUTDAT -- MOVE DATA: LOCAL TO NETWORK (PUT)
;
PUTDAT:	BEGINR <UTIL,IO>
	CALLR LOCS			; get length of file
	AOS NSIZE
	ADDM IO,NSUM
	ADDM IO,NSIZE
	CALLR NETMSG
	 JRST PUTD4
	HRROI X1,IO
	.IOT DDO,X1
	SETZ UTIL,
PUTD1:	MOVE X1,[-2000,,IOBUFR]
	.IOT LCI,X1			; read 1K from local file
	JUMPL X1,PUTD2			; hit EOF here
	CALLR NETMSG
	 JRST PUTD4
	MOVE X1,[-2000,,IOBUFR]
	.IOT DDO,X1
	MOVSI X1,-2000			; compute checksum
	ADD UTIL,IOBUFR(X1)
	AOBJN X1,.-1
	JRST PUTD1
PUTD2:	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD4
	MOVE X1,X1SAVE#
	MOVNI X1,-IOBUFR(X1)		; get -# of words transferred
	JUMPE X1,PUTD3
	HRLZS X1
	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD4
	MOVE X1,X1SAVE#
	HRRI X1,IOBUFR
	.IOT DDO,X1
	MOVE X1,X1SAVE#
	ADD UTIL,IOBUFR(X1)
	AOBJN X1,.-1
PUTD3:	ADDM UTIL,NSUM
	ADDM UTIL,NSUM
	CALLR NETMSG
	 JRST PUTD4
	HRROI X1,UTIL
	.IOT DDO,X1
PUTD4:	.RDTIM X1,
	IDIVI X1,↑D30
	SUBM X1,NTIME
	ENDR
; EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
;
EXAFIL:	BEGINR <IO,BP,FLAG,UTIL>
	.RDTIM X1,
	IDIVI X1,↑D30
	MOVEM X1,NTIME
	MOVE IO,[-GET$F,,FBUF]
	.IOT DDI,IO
	JUMPL IO,RETN(0)
	MOVEI IO,GET$F
	MOVEM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<FBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[-GET$E,,EBUF]
	.IOT DDI,IO
	MOVEI IO,GET$E
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<EBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[-GET$D,,ABUF]
	.IOT DDI,IO
	MOVEI IO,GET$D
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<ABUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	HRROI IO,ABUF
	.IOT DDI,IO
	MOVE IO,ABUF			; ITS crock
	AOS NSIZE
	ADDM IO,NSUM
	HRROI IO,ABUF
	.IOT DDI,IO
	MOVE IO,ABUF
	AOS NSIZE
	ADDM IO,NSUM
	HRROI IO,FLAG
	.IOT DDI,IO
	JUMPE FLAG,EXAF2
	ADDM FLAG,NSUM
	AOS NSIZE
	ADDM FLAG,NSIZE
	SKIPL DEXA$S
	 JRST EXAF0
	MOVE X2,[440700,,FBUF]
	ILDB X1,X2
	CAILE X1," "
	 JRST .-2
	SETZ X1,
	DPB X1,X2
	MOVE X2,[440700,,EBUF]
	ILDB X1,X2
	CAILE X1," "
	 JRST .-2
	SETZ X1,
	DPB X1,X2
	TSOUT <[ASCIZ/ [/],FBUF,[ASCIZ/./],EBUF,[ASCIZ/]/],CRLF>
EXAF0:	SETZ UTIL,
EXAF1:	MOVEI IO,(FLAG)
	CAILE IO,2000
	 MOVEI IO,2000
	SUBI FLAG,(IO)
	HRLOI X1,-1(IO)
	EQVI X1,IOBUFR
	MOVEM X1,X1SAVE#
	.IOT DDI,X1
	IMULI IO,5
	MOVE BP,[440700,,IOBUFR]
	CALLR DEXA$
	MOVE X1,X1SAVE#
	ADD UTIL,(X1)
	AOBJN X1,.-1
	JUMPG FLAG,EXAF1
EXAF2:	ADDM UTIL,NSUM
	HRROI IO,ABUF
	.IOT DDI,IO
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	HRROI IO,ABUF
	.IOT DDI,IO
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	CAMN IO,UTIL
	 JRST EXAF3
	TSOUT <[ASCIZ/ (File Checksum Error)/],CRLF>
EXAF3:	.RDTIM X1,
	IDIVI X1,↑D30
	SUBM X1,NTIME
	ENDR SKIP,1
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR <IO,UTIL>
	.RDTIM X1,
	IDIVI X1,↑D30
	MOVEM X1,NTIME
	MOVE IO,[-GET$F,,FBUF]
	.IOT DDI,IO
	JUMPL IO,RETN(0)
	MOVEI IO,GET$F
	MOVEM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<FBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[-GET$E,,EBUF]
	.IOT DDI,IO
	MOVEI IO,GET$E
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<EBUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[-GET$D,,ABUF]
	.IOT DDI,IO
	MOVEI IO,GET$D
	ADDM IO,NSIZE
	SETZ UTIL,
	ADD UTIL,<ABUF-1>(IO)
	SOJG IO,.-1
	ADDM UTIL,NSUM
	MOVE IO,[440700,,ABUF]
	CALLR LUTTSN
	MOVEM UTIL,LCLDAT
	HRROI IO,ABUF
	.IOT DDI,IO
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	HRROI IO,ABUF
	.IOT DDI,IO
	AOS NSIZE
	MOVE X1,ABUF
	ADDM X1,NSUM
	ENDR SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT:	BEGINR <IO,UTIL,FLAG>
	HRROI IO,FLAG
	.IOT DDI,IO
	JUMPE FLAG,GETD3
	ADDM FLAG,NSUM
	AOS NSIZE
	ADDM FLAG,NSIZE
	SETZ UTIL,
GETD1:	CAIGE FLAG,2000
	 JRST GETD2
	SUBI FLAG,2000
	MOVE X1,[-2000,,IOBUFR]
	.IOT DDI,X1			; read 1K from DATACOMPUTER
	MOVE X1,[-2000,,IOBUFR]
	.IOT LCO,X1
	MOVSI X1,-2000			; compute checksum
	ADD UTIL,IOBUFR(X1)
	AOBJN X1,.-1
	JRST GETD1
GETD2:	JUMPE FLAG,GETD3
	HRLOI X1,-1(FLAG)
	EQVI X1,IOBUFR
	MOVEM X1,X1SAVE#
	.IOT DDI,X1
	MOVE X1,X1SAVE#
	.IOT LCO,X1
	MOVE X1,X1SAVE#
	ADD UTIL,(X1)
	AOBJN X1,.-1
GETD3:	ADDM UTIL,NSUM
	HRROI IO,ABUF
	.IOT DDI,IO
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	HRROI IO,ABUF
	.IOT DDI,IO
	MOVE IO,ABUF
	ADDM IO,NSUM
	AOS NSIZE
	CAMN IO,UTIL
	 JRST GETD4
	TSOUT <[ASCIZ/ (File Checksum Error)/],CRLF>
GETD4:	.RDTIM X1,
	IDIVI X1,↑D30
	SUBM X1,NTIME
	ENDR
; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR <IO>
	SKIPE FLAGSM		; Is NETMSG allowed to eat datalanguage?
	 RETURN SKIP,1		; no!!
NETMS1:	.CALL [	SETZ
		SIXBIT/WHYINT/
		MOVEI DCI
		MOVEM IO
		MOVEM IO
		SETZM IO]
	 THUD
	JUMPE IO,RETN(1)
	DCBIN <IO>
	CAIN IO,"?"
	 JRST DEATH
	CAIN IO,"!"
	 JRST NETMS2
	CAIE IO,"+"
	 CAIN IO,"-"
	  JRST NETMS3
	CAIN IO,"."
	 JRST NETMS4
	CALLR RENLIN
	JRST NETMS1
NETMS2:	CALLR RENLIP
	JRST NETMS1
NETMS3:	CALLR RENLIP
	RETURN
NETMS4:	SETOM FLAGSM		; forbid any more gobbling
	CALLR RENLIN
	ENDR SKIP,1
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR <IO>
	SETZM GBUF1
	LDB X1,[350700,,FBUF]
	CAIN X1,"*"
	 SETOM GBUF1
	SETZM GBUF2
	LDB X1,[350700,,EBUF]
	CAIN X1,"*"
	 SETOM GBUF2
	SETO X1,
	CAME X1,FSBUF
	 CAMN X1,ESBUF
	  CAIA
	   JRST	LOCFI5
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI
		[('DSK')]
		['.FILE.']
		['(DIR) ']
		SETZ LCLSNM]
	 JRST LOCFNF
	MOVE X1,[-2000,,DIRBLK]
	.IOT X1
	.CLOSE
LOCFI1:	MOVE IO,DIRBLK+1		; POINTER TO NAME AREA
	ADDI IO,DIRBLK
	CAIN IO,DIRBLK+2000		; END OF DIRECTORY?
	 JRST LOCFNF
	MOVEI X1,5
	ADDM X1,DIRBLK+1
	SETO X1,
	CAME X1,FSBUF
	 JRST LOCFI2
	CAME X1,ESBUF
	 JRST LOCFI3
	JRST LOCFI4
LOCFI2:	MOVE X1,[440700,,FSBUF]
	MOVE X2,[440600,,X4]
	MOVEI X3,6
	SETZ X4,
	ILDB X1
	CAIN "."
	 JRST .+5
	JUMPE .+4
	SUBI " "
	IDPB X2
	SOJG X3,.-6
	CAMN X4,(IO)
	 JRST LOCFI4
	JRST LOCFI1
LOCFNF:	TSOUT <[ASCIZ/ (No Such File)/],CRLF>
	RETURN

LOCFI3:	MOVE X1,[440700,,ESBUF]
	MOVE X2,[440600,,X4]
	SETZ X4,
	MOVEI X3,6
LOCFI6:	ILDB X1
	CAIN "."
	 JRST LOCFI7
	JUMPE LOCFI7
	SUBI " "
	IDPB X2
	SOJG X3,LOCFI6
LOCFI7:	CAME X4,1(IO)
	 JRST LOCFI1
LOCFI4:	MOVE X1,(IO)
	MOVEM X1,LCLFN1
	MOVE X1,1(IO)
	MOVEM X1,LCLFN2
LOCFI5:	CALLR LOCOI
	 RETURN
	.CLOSE
	ENDR SKIP,1
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR <IO>
	CALLR LOCC
	SETO X1,
	CAME X1,FSBUF
	 CAMN X1,ESBUF
	  JRST LOCNI0
	RETURN SKIP,1
LOCNI0:	MOVE IO,DIRBLK+1
	ADDI IO,DIRBLK
	CAIN IO,DIRBLK+2000
	 RETURN SKIP,1
	MOVEI X1,5
	ADDM X1,DIRBLK+1
	SETO X1,
	CAME X1,FSBUF
	 JRST LOCNI1
	CAME X1,ESBUF
	 JRST LOCNI2
	JRST LOCNI3
LOCNI1:	MOVE X1,[440700,,FSBUF]
	MOVE X2,[440600,,X4]
	MOVEI X3,6
	SETZ X4,
LOCNI6:	ILDB X1
	CAIN "."
	 JRST LOCNI7
	JUMPE LOCNI7
	SUBI " "
	IDPB X2
	SOJG X3,LOCNI6
LOCNI7:	CAMN X4,(IO)
	 JRST LOCNI3
	JRST LOCNI0
LOCNI2:	MOVE X1,[440700,,ESBUF]
	MOVE X2,[440600,,X4]
	MOVEI X3,6
	SETZ X4,
LOCNI8:	ILDB X1
	CAIN "."
	 JRST LOCNI9
	JUMPE LOCNI9
	SUBI " "
	IDPB X2
	SOJG X3,LOCNI8
LOCNI9:	CAME X4,1(IO)
	 JRST LOCNI0
LOCNI3:	MOVE X1,(IO)
	MOVEM X1,LCLFN1
	MOVE X1,1(IO)
	MOVEM X1,LCLFN2
	.CALL [	SETZ
		SIXBIT/OPEN/
		MOVSI .BII
		MOVEI LCI
		[('DSK')]
		LCLFN1
		LCLFN2
		SETZ LCLSNM]
	 JRST LOCNI0
	SKIPN GBUF1
	 JRST LOCNI4
	MOVE X1,[440600,,LCLFN1]
	MOVEI X2,6
	MOVE X3,[440700,,FBUF]
LCNI10:	ILDB X4,X1
	SKIPE X4
	 ADDI X4,40
	IDPB X4,X3
	SOJG X2,LCNI10
LOCNI4:	SKIPN GBUF2
	 JRST LOCNI5
	MOVE X1,[440600,,LCLFN2]
	MOVEI X2,6
	MOVE X3,[440700,,EBUF]
LCNI11:	ILDB X4,X1
	SKIPE X4
	 ADDI X4,40
	IDPB X4,X3
	SOJG X2,LCNI11
LOCNI5:	.IOT TTO,[" "]
	.IOT TTO,["("]
	TSOUT <FBUF>
	.IOT TTO,["."]
	TSOUT <EBUF>
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR <IO>
	SETZ X1,
	SETO X2,
	CAMN X2,FSBUF
	 TRO X1,400000
	CAMN X2,ESBUF
	 TRO X1,200000
	JUMPE X1,RETN(0)
	MOVE X2,[440700,,ABUF]
	MOVE X3,[440700,,FSBUF]
	TRNE X1,400000
	 HRRI X3,FBUF
LOCNF1:	ILDB X4,X3
	CAIN X4," "
	 SETZ X4,
	IDPB X4,X2
	JUMPN X4,LOCNF1
	SKIPN ESBUF
	 JRST LOCNOO
	MOVEI X4,"."
	DPB X4,X2
	MOVE X3,[440700,,ESBUF]
	TRNE X1,200000
	 HRRI X3,EBUF
LOCNF2:	ILDB X4,X3
	CAIN X4," "
	 SETZ X4,
	IDPB X4,X2
	JUMPN X4,LOCNF2
LOCNOO:	MOVEI IO,ABUF
	CALLR LUTFN
	.IOT TTO,[" "]
	.IOT TTO,["("]
	TSOUT ABUF
	.IOT TTO,[")"]
	.IOT TTO,[15]
	.IOT TTO,[12]
	ENDR
>
; (((↑↑↑)))
	SUBTTL System Dependent Routines for TOPS-10

; (((TOPS-10)))
IFE F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	0,[SIXBIT/DFTP/]
	SETNAM	0,
	OPEN	0,[	200	; TURN OFF TTY ECHOING
			SIXBIT	/TTY/
			0]
	 THUD
	MOVE	0,[SIXBIT/DSK/]
	MOVEM	0,LFCHAS+1
IFN F.SAIL,<SETZ
	DSKPPN>
IFE F.SAIL,<GETPPN>
	MOVEM	0,LFIPPN
	CALLR	ICP
	ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR	<IO,UTIL>
	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVEM	X1,NTIME
	MOVE	IO,[-GET$F,,FBUF]
	CALLR	NUTFB
	 RETURN
	MOVEI	IO,GET$F
	MOVEM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$E,,EBUF]
	CALLR	NUTFB
	MOVEI	IO,GET$E
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$D,,ABUF]
	CALLR	NUTFB
	MOVEI	IO,GET$D
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<ABUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[440700,,ABUF]
	CALLR	LUTTSN
	DPB	IO,[001400,,LFILE+2]
	LSH	IO,-14
	DPB	IO,[170300,,LFILE+1]
	DPB	UTIL,[141300,,LFILE+2]
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	SKIPLE	X1
	 MOVE	X1,LFCHAS
	MOVMS	X1
	DPB	X1,[270400,,LFILE+2]
	ENDR	SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
GETDAT:	BEGINR	<IO,UTIL,FLAG>
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	FLAG,ABUF
	JUMPE	FLAG,GETD2
	ADDM	FLAG,NSUM
	AOS	NSIZE
	ADDM	FLAG,NSIZE
	SETZ	UTIL,
	SKIPE	FLAGFE
	 JRST	GETD3
	OUT	LFCHAN,
	 CAIA
	  THUD
GETD1:	IBP	LFOBUF+1	;Ensure validity of RH due to CMU bug
	HRLI	IO,(FLAG)
	CAILE	FLAG,SIZBLK
	 HRLI	IO,SIZBLK
	HRR	IO,LFOBUF+1
	CALLR	NUTFB
	MOVEI	IO,-1(FLAG)
	CAILE	FLAG,SIZBLK
	 MOVEI	IO,SIZBLK-1
	SUBI	FLAG,1(IO)
	HRRO	X1,LFOBUF+1
	ADDM	IO,LFOBUF+1
	TLC	X1,(IO)
	ADD	UTIL,(X1)
	AOBJN	X1,.-1
	OUT	LFCHAN,
	 CAIA
	  THUD
	JUMPG	FLAG,GETD1
GETD2:	ADDM	UTIL,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	CAMN	IO,UTIL
	 JRST	GETD4
	TSOUT	<[ASCIZ/ (File Checksum Error)/],CRLF>
	JRST	GETD4
IFE F.SAIL,<
GETD3:	ADDM	UTIL,NSUM
	SETZ	UTIL,
	SKIPE	DDIBUF+2
	 JRST	GETD9
GETD$:	STATZ	DDCHAN,020000
	 JRST	GETD4
	IN	DDCHAN,
	 CAIA
	  JRST	GETD4
GETD9:	IBP	DDIBUF+1	;Ensure RH of pointer is valid due to CMU bug
	MOVN	X1,DDIBUF+2
	HRLZI	X1,(X1)
	HRR	X1,DDIBUF+1
	ADD	UTIL,(X1)
	AOBJN	X1,.-1
	ADDM	UTIL,NSUM
	SETZB	UTIL,DDIBUF+2
	JRST	GETD$
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
GETD3:	IN	DDCHAN,
	 JRST	GETD3
>;IFN F.SAIL
; (((↑↑↑)))
GETD4:	MSTIME	X1,
	IDIVI	X1,↑D1000
	SUBM	X1,NTIME
	ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR	<IO,BP,UTIL>
	OUT	DDCHAN,
	 CAIA
	  THUD
	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVEM	X1,NTIME
	IBP	DDOBUF+1	;Ensure RH valid due to CMU bug
	HRR	BP,DDOBUF+1
	HRLI	BP,440700
	MOVE	UTIL,[440700,,FBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	MOVE	UTIL,[440700,,EBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	LDB	IO,[001400,,LFILE+2] ; CREATION DATE
	LDB	UTIL,[170300,,LFILE+1]
	LSH	UTIL,14
	IORI	IO,(UTIL)
	LDB	UTIL,[141300,,LFILE+2] ; CREATION TIME
	CALLR	LUTTNS
	DATE	IO,
	MSTIME	X1,
	IDIVI	X1,<↑D1000*↑D60>
	MOVE	UTIL,X1
	CALLR	LUTTNS
	HRLI	BP,004400
	MOVE	UTIL,VBUF
	IDPB	UTIL,BP
	CALLR	LOCS
	IDPB	IO,BP
	LDB	UTIL,[270400,,LFILE+2] ; DATA MODE
	MOVNS UTIL
	IDPB	UTIL,BP
	HRRO	X1,DDOBUF+1
	MOVEM	BP,DDOBUF+1
	SUBI BP,-1(X1)
	HRRZM	BP,NSIZE
	TLC	X1,-1(BP)
	SETZ UTIL,
	ADD	UTIL,(X1)
	AOBJN	X1,.-1
	ADDM	UTIL,NSUM
	OUT	DDCHAN,
	 CAIA
	  THUD
	ENDR
; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT:	BEGINR	<IO,UTIL>
	CALLR	LOCS
	AOS	NSIZE
	ADDM	IO,NSUM
	ADDM	IO,NSIZE
	AOS	DDOBUF+1
	MOVEM	IO,@DDOBUF+1
	OUT	DDCHAN,
	 CAIA
	  THUD
	SETZ	UTIL,
	JRST	PUTD2B

PUTD1:	ILDB	X1,LFIBUF+1
	ADD	UTIL,X1
	SOSLE	DDOBUF+2
	 JRST	PUTD2A
IFN F.SAIL,<
	MOVEM X1,X1SAVE#
	CALLR NETMSG
	 JRST PUTD3
	MOVE X1,X1SAVE#
>
	OUT	DDCHAN,
	 JRST	PUTD2A
IFN F.SAIL,<THUD>
IFE F.SAIL,<
	STATO	DDCHAN,400000
	 THUD
	JRST	PUTD3
>
PUTD2A:	IDPB	X1,DDOBUF+1
PUTD2B:	SOSG	LFIBUF+2
	 IN	LFCHAN,
	  JRST	PUTD1
	STATO	LFCHAN,20000
	 THUD
	AOS	NSIZE
	ADDM	UTIL,NSUM
	ADDM	UTIL,NSUM
	AOS	DDOBUF+1
	MOVEM	UTIL,@DDOBUF+1
IFE F.SAIL,<
	OUT	DDCHAN,
	 JRST	.+3
	  STATO	DDCHAN,400000
	   THUD
>
IFN F.SAIL,<
	OUT	DDCHAN,
	 CAIA
	  THUD
>
PUTD3:	MSTIME	X1,
	IDIVI	X1,↑D1000
	SUBM	X1,NTIME
	ENDR
; EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
;
EXAFIL:	BEGINR	<IO,BP,FLAG,UTIL>
	MSTIME	X1,
	IDIVI	X1,↑D1000
	MOVEM	X1,NTIME
	MOVE	IO,[-GET$F,,FBUF]
	CALLR	NUTFB
	 RETURN
	MOVEI	IO,GET$F
	MOVEM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$E,,EBUF]
	CALLR	NUTFB
	MOVEI	IO,GET$E
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[GET$D,,ABUF]
	CALLR	NUTFB
	MOVEI	IO,GET$D
	ADDM	IO,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<ABUF-1>(IO)
	SOJG	IO,.-1
	ADDM	UTIL,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	AOS	NSIZE
	MOVE	X1,ABUF
	ADDM	X1,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	FLAG,ABUF
	JUMPE	FLAG,EXAF2
	ADDM	FLAG,NSUM
	AOS	NSIZE
	ADDM	FLAG,NSIZE
	SKIPL	DEXA$S
	 JRST	EXAF0
	MOVE	X2,[440700,,FBUF]
EXAF5:	ILDB	X1,X2
	CAILE	X1," "
	 JRST	EXAF5
	SETZ	X1,
	DPB	X1,X2
	MOVE	X2,[440700,,EBUF]
EXAF6:	ILDB	X1,X2
	CAILE	X1," "
	 JRST	EXAF6
	SETZ	X1,
	DPB	X1,X2
	TSOUT	<[ASCIZ/ [/],FBUF,[ASCIZ/./],EBUF,[ASCIZ/]/],CRLF>
EXAF0:	SETZ	UTIL,
EXAF1:	HRLI	IO,(FLAG)
	CAIL	FLAG,SIZBLK
	 HRLI	IO,SIZBLK
	HRRI	IO,EXABUF
	CALLR	NUTFB
	MOVEI	IO,(FLAG)
	CAILE	IO,SIZBLK
	 MOVEI	IO,SIZBLK
	SUBI	FLAG,(IO)
	HRLOI	X1,-1(IO)
	EQVI	X1,EXABUF
	PUSH	STAK,X1
	IMULI	IO,5
	MOVE	BP,[440700,,EXABUF]
	CALLR	DEXA$
	POP	STAK,X1
	ADD	UTIL,(X1)
	AOBJN	X1,.-1
	JUMPG	FLAG,EXAF1
EXAF2:	ADDM	UTIL,NSUM
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	MOVE	IO,[1,,ABUF]
	CALLR	NUTFB
	MOVE	IO,ABUF
	ADDM	IO,NSUM
	AOS	NSIZE
	CAMN	IO,UTIL
	 JRST	EXAF3
	TSOUT	<[ASCIZ/ (File Checksum Error)/],CRLF>
EXAF3:	MSTIME	X1,
	IDIVI	X1,↑D1000
	SUBM	X1,NTIME
	ENDR	SKIP,1
; TOPS-10 ICP:		1) SET CONNECTION SOCKETS IN LISTENING STATE
;			2) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			3) OPEN CONNECTION SOCKETS
;				A) EVEN - RECEIVE
;				B) ODD - SEND
;
ICP:	BEGINR	<IO,UTIL,FLAG>
; (((NOT SAIL)))
IFE F.SAIL,<
ICPBEG:	SETZM	ICPBLK+.IBDEV
	SETZM	DCIBLK+.IBDEV
	SETZM	DCOBLK+.IBDEV
	SETZM	DCIBLK+.IBRMT
	SETZM	DCOBLK+.IBRMT
	MOVE	IO,LINP		; LISTEN ON INPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 CAIA
	  JRST	ICPICP
	MOVE	IO,DCIBLK+.IBERR
	CAIE	IO,.IESKT
	 JRST	ICPEIL
	MOVE	IO,PWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	LDB	X4,[221100,,WRKBLK+.IBHST] ; NUMBER OF IMP DEVICES
	GETPPN	UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,102
	SETZ	X3,
	SETZ	FLAG,
ICPRDV:	MOVE	IO,[SIXBIT/IMP/]	; RESET DEVICE(S) USED
	MOVEM	IO,WRKBLK+.IBDEV
	MOVEI	X1,(X3)
	IDIVI	X1,10
	JUMPE	X1,ICPRD1
	ADDI	X1,20
	ADDI	X2,20
	DPB	X1,[140600,,WRKBLK+.IBDEV]
	DPB	X2,[060600,,WRKBLK+.IBDEV]
	JRST	ICPRD2
ICPRD1:	ADDI	X2,20
	DPB	X2,[140600,,WRKBLK+.IBDEV]
ICPRD2:	SETZM	WRKBLK+.IBLCL
	MOVE	IO,SWRK
	CALL	IO,[SIXBIT/IMPUUO/]	; TEST STATUS OF SOCKET
	 JRST	ICPRD3
	HRRZ	IO,WRKBLK+.IBHST	; FOREIGN HOST
	CAIE	IO,DCHOST
	 JRST	ICPRD3
	PJOB	X1,
	HLRZ	X2,WRKBLK+.IBSTT	; OWNING JOB
	CAIE	X2,(X1)
	 JRST	ICPRD3
	MOVE	IO,WRKBLK+.IBLCL
	CAMN	IO,UTIL		; DATALANGUAGE SOCKET(S)
	 JRST	ICPCLS
	SUBI	IO,2
	CAMN	IO,UTIL		; INPUT DATA SOCKET
	 JRST	ICPCLI
ICPRD3:	MOVEI	IO,1			; OUTPUT DATA SOCKET
	MOVEM	IO,WRKBLK+.IBLCL
	MOVE	IO,SWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	HRRZ	IO,WRKBLK+.IBHST
	CAIE	IO,DCHOST
	 JRST	ICPRD4
	PJOB	X1,
	HLRZ	X2,WRKBLK+.IBSTT
	CAIE	X2,(X1)
	 JRST	ICPRD4
	MOVE	IO,WRKBLK+.IBLCL
	SUBI	IO,3
	CAMN	IO,UTIL
	 JRST	ICPCLO
ICPRD4:	ADDI	X3,1
	CAIGE	X3,(X4)
	 JRST	ICPRDV
	JUMPN	FLAG,ICPBEG
	OUTSTR	[ASCIZ/ (Connections in use)/]
	EXIT
ICPCLS:	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVEI	IO,1
	MOVEM	IO,WRKBLK+.IBLCL
	MOVE	IO,SWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	OUTSTR	[ASCIZ/ [Restarting]
/]
	SETO	FLAG,
	JRST	ICPRDV
ICPCLI:	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	OUTSTR	[ASCIZ/ (Retrieve interrupted:  connection closed)
/]
	JRST	ICPRDV
ICPCLO:	MOVE	IO,CWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPERD
	OUTSTR	[ASCIZ/ (Store interrupted:  connection closed)
/]
	JRST	ICPRDV
ICPICP:	MOVE	IO,DCIBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IO,DCOBLK+.IBDEV	;   AND COPY IT FOR DUPLEX
	MOVEM	IO,DCCHAS+1
	MOVE	IO,LOUT		; LISTEN ON OUTPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	ICPEOL
	MOVE	IO,OICP
	CALL	IO,[SIXBIT/IMPUUO/]	; OPEN CONNECTION
	 JRST	ICPEC
	MOVE	IO,ICPBLK+.IBDEV	; GET DEVICE NAME
	MOVEM	IO,ICCHAS+1
	OPEN	DCCHAN,ICCHAS	; OPEN AS STANDARD DEVICE
	 JRST	ICPEF
	IN	DCCHAN,
	 CAIA
	  JRST	ICPET
	MOVE	IO,ICPBUF+1
	MOVE	IO,1(IO)	; GET THE SOCKET NUMBER
	LSH	IO,-4		; RIGHT JUSTIFY 32 BITS
	MOVEM	IO,DCOBLK+.IBRMT
	AOJ	IO,
	MOVEM	IO,DCIBLK+.IBRMT
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
	MOVE	IO,CICP
	CALL	IO,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	MOVE	IO,OINP		; OPEN INPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
	MOVE	IO,OOUT		; OPEN OUTPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
	OPEN	DCCHAN,DCCHAS
	 JRST	NETECF
	OUT	DCCHAN,
	 CAIA
	  JRST	NETEOT
	MOVE	IO,PWRK
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	QUIT
	HRRZ	IO,WRKBLK+.IBHST
	MOVEM	IO,LHOST
>
; (((↑↑↑)))
; (((SAIL)))
IFN F.SAIL,<
; POSITIONS IN MTAPE BLOCK

STLOC==1	; STATUS BITS RETURNED HERE
LSLOC==2	; LOCAL SOCKET
WFLOC==3	; WAIT FLAG
BSLOC==4	; BYTE SIZE LOCATION
FSLOC==5	; FOREIGN SOCKET
HLOC==6		; HOST NUMBER

ERRBTS==763600	; I/O ERROR BITS

ICPBEG:	; Tovar says this is the right thing to do - MRC
	PJOB X2,		; GET JOB #
	TIMER X1,		; GET A "RANDOM" VALUE
	ANDI X1,377770		; BUT INSURE ONLY A HALFWORD
	MOVSS X4,X2		; RECEIVE SOCKET
	ADDI X2,(X1)		; THIS BARFUCIOUS CROCK IS BECAUSE SAIL
	ADDI X4,(X1)		; DOESN'T ALWAYS RESET SOCKETS FAST ENOUGH
				; AND ALL SORTS OF RANDOM CRAP HAPPENS.
	ADDI X4,1		; TRANSMIT SOCKET
	MOVEI X1,13		; SAIL'S HOST ADDRESS NUMBER
	MOVEM X1,LHOST	; SAVE IT AWAY
	INIT DCCHAN,17
	SIXBIT /IMP/
	0
	 JRST ICPLUZ
	SETZM CONECB
	MOVEM X2,CONECB+LSLOC
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X3,40
	MOVEM X3,CONECB+BSLOC
	MOVEI X3,DCSOKT
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 2,24,0,12,12
		]		; TIME OUT CLS, RFNM, RFC, AND INPUT
	MTAPE DCCHAN,CONECB
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; NO CONNECTION TO LOGGER
	INPUT DCCHAN,[IOWD 1,FRS#
		0]
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; GOT LOGGER BUT DIDN'T GET SOCKET FROM HIM
	MOVE X3,FRS
	LSH X3,-4
	MOVEM X3,FRS
	ADDI X3,1
	MOVEM X3,FSS#
	ADDI X2,2
	MOVEM X2,LRS#
	ADDI X4,2
	MOVEM X4,LSS#
	MOVE X1,CONECB+LSLOC
	MOVEM X1,TERBLK+LSLOC
	MTAPE DCCHAN,TERBLK	; RELEASE LOGGER
	INIT DCCHAN,1
	SIXBIT /IMP/
	XWD DCOBUF,DCIBUF
	 JRST ICPLUZ
	MTAPE DCCHAN,[
		↑D15
		BYTE (6) 5,24,0,12,0
		]		; TIME OUT CLS, RFNM, AND RFC
	MOVEI X1,↑D8
	DPB X1,[300600,,DCIBUF+1]
	DPB X1,[300600,,DCOBUF+1]
	MOVEM X2,CONECB+LSLOC
	MOVEI X3,DCHOST
	MOVEM X3,CONECB+HLOC
	SETZM CONECB+WFLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MOVE X3,FSS
	MOVEM X3,CONECB+FSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO RECEIVE SIDE
	CALLR CLSCHK		; SEE IF WE ARE REALLY OPEN
	 JRST ICPLUZ
	AOS CONECB+LSLOC
	SOS CONECB+FSLOC
	MOVEI X3,↑D8
	MOVEM X3,CONECB+BSLOC
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TRNN X1,-1
	 STATZ DCCHAN,ERRBTS
	  JRST ICPLUZ		; CAN'T CONNECT TO SEND SIDE
	CALLR CLSCHK
	 JRST ICPLUZ
	MOVEI X3,4
	MOVEM X3,CONECB
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ
	SOS CONECB+LSLOC
	CALLR CLSCHK
	 JRST ICPLUZ
	MTAPE DCCHAN,CONECB
	MOVE X1,CONECB+STLOC
	TLC X1,300000
	TLCN X1,300000
	 TLNE X1,060000
	  JRST ICPLUZ
	STATZ DCCHAN,ERRBTS
	 JRST ICPLUZ		; LOST WHILE WAITING FOR RECEIVE SIDE TO CONNECT
	CALLR CLSCHK
	 JRST ICPLUZ
	RETURN

; HERE WHEN CONNECTION FAILS

ICPLUZ:	OUTSTR [ASCIZ/? Cannot establish network connection/]
	EXIT
>
; (((↑↑↑)))
	ENDR
; NETWORK QUIT -- BREAK DATACOMPUTER CONNECTIONS
;
QUIT:	MOVEI	IO,"Z"-100
	IDPB	IO,DCOBUF+1
	OUT	DCCHAN,
	 JFCL
QUIT01:	INPUT	DCCHAN,
	STATZ	DCCHAN,20000
	 JRST	QUIT02
	SKIPE	FLAGDD
	 CALLR	NUTDD
	JRST	QUIT01
QUIT02:	RELEAS	DCCHAN,		; RELEASE INPUT/OUTPUT DEVICE
QUIT03:	IFE F.SAIL,<
	MOVE	IO,COUT		; CLOSE OUTPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEOC
>
QUIT04:	IFE F.SAIL,<
	MOVE	IO,CINP		; CLOSE INPUT SOCKET
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	NETEIC
>
	EXIT
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
IFE F.SAIL,<
	RELEAS	DDCHAN,
	SETZM	DCDBLK+.IBDEV
	MOVEI	X1,104
	MOVEM	X1,DCDBLK+.IBLCL
	MOVE	X1,DCIBLK+.IBRMT
	ADDI	X1,2
	MOVEM	X1,DCDBLK+.IBRMT
	MOVE	X1,ODAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
	MOVE	X1,DCDBLK+.IBDEV
	MOVEM	X1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	MOVE	X1,CDAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOI2
>
IFN F.SAIL,<
	OPEN DDCHAN,DDCHAS
	 JRST NETOI2
	MTAPE DDCHAN,[	15		;ALLOCATE
			1
			0
			0]
	SETZM CONECB
	MOVE X1,LRS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FSS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOI2
	RETURN SKIP,1
>
NETOI2:	OUTSTR	[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR
; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
IFE F.SAIL,<
	RELEAS	DDCHAN,
	SETZM	DCDBLK+.IBDEV
	MOVEI	X1,105
	MOVEM	X1,DCDBLK+.IBLCL
	MOVE	X1,DCOBLK+.IBRMT
	ADDI	X1,2
	MOVEM	X1,DCDBLK+.IBRMT
	MOVE	X1,ODAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
	MOVE	X1,DCDBLK+.IBDEV
	MOVEM	X1,DDCHAS+1
	OPEN	DDCHAN,DDCHAS
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	MOVE	X1,CDAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETOO2
>
IFN F.SAIL,<
	OPEN DDCHAN,DDCHAS
	 JRST NETOO2
	MTAPE DDCHAN,[	15		; ALLOCATE
			1
			0
			0]
	SETZM CONECB
	MOVE X1,LSS
	ADDI X1,2
	MOVEM X1,CONECB+LSLOC
	MOVEI X1,DCHOST
	MOVEM X1,CONECB+HLOC
	SETOM CONECB+WFLOC
	MOVEI X1,↑D36
	MOVEM X1,CONECB+BSLOC
	MOVE X1,FRS
	ADDI X1,2
	MOVEM X1,CONECB+FSLOC
	MTAPE DDCHAN,CONECB
	STATZ DDCHAN,ERRBTS
	 JRST NETOO2
	RETURN SKIP,1
>
NETOO2:	OUTSTR	[ASCIZ / ?? Network connection OPEN failure ??
/]
	ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
IFE F.SAIL,<
	STATZ	DDCHAN,400000
	 RETURN
>
IFN F.SAIL,<
	MOVEI 3			; TERMINATE CONNECTION
	MOVEM CONECB
	SETOM CONECB+WFLOC	; WAIT FOR CLS REC'VD
	MTAPE DDCHAN,CONECB	; CLOSE IT
>
	RELEAS	DDCHAN,
IFE F.SAIL,<
	MOVE	X1,CDAT
	CALL	X1,[SIXBIT/IMPUUO/]
	 JRST	NETC1
	RETURN
NETC1:	OUTSTR	[ASCIZ / ?? Network connection CLOSE failure ??
/]
>
	ENDR
; (((SAIL)))
IFN F.SAIL,<
; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR	<IO>
	SKIPE FLAGSM			; NETMSG allowed to gobble?
	 RETURN SKIP,1			; no!!
NETMS1:	MOVE	IO,DCIBUF+2		; check for cruft read but still
	CAILE	IO,20			;  not input by dftp
	 JRST	NETM1A			; stuff in buffer still
	HRRZ	IO,DCIBUF		; try another buffer
	HRRZ	IO,(IO)
	SKIPGE	(IO)
	 JRST	NETM1A
	MTAPE	DCCHAN,[10]		; try still in monitor
	 RETURN	SKIP,1
NETM1A:	DCBIN	<IO>
	CAIN	IO,"?"
	 JRST	DEATH
	CAIN	IO,"!"
	 JRST	NETMS2
	CAIE	IO,"+"
	 CAIN	IO,"-"
	  JRST	NETMS3
	CAIN IO,"."
	 JRST NETMS4
	CALLR	RENLIN
	JRST	NETMS1
NETMS2:	CALLR	RENLIP
	JRST	NETMS1
NETMS3:	CALLR	RENLIP
	RETURN
NETMS4:	SETOM FLAGSM
	CALLR RENLIN
	ENDR SKIP,1
>
; (((↑↑↑)))
; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;   OUT: UTIL
;
NETDSI:	BEGINR
IFN F.SAIL,<MOVE UTIL,LRS
	ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,104>
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;   OUT: UTIL
;
NETDSO:	BEGINR
IFN F.SAIL,<MOVE UTIL,LSS
	ADDI UTIL,2>
IFE F.SAIL,<GETPPN UTIL,
	HRRZI	UTIL,(UTIL)
	LSH	UTIL,11
	ADDI	UTIL,105>
	ENDR
; NETFFI -- NETWORK FIX FIRST FILE FOR INPUT
;
NETFFI:	BEGINR
	SETO	X1,
	CAME	X1,FSBUF
	 CAMN	X1,ESBUF
	  CAIA
	   JRST	NETFI1
	TSOUT	<[ASCIZ/ (/],LUTDSF,RPAREN>
NETFI1:	SKIPN	GBUF1
	 JRST	NETFI2
	MOVE	X1,[440600,,LFILE]
	MOVEI	X2,6
	MOVE	X3,[440700,,FBUF]
NETFI4:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,NETFI4
NETFI2:	SKIPN	GBUF2
	 RETURN
	MOVE	X1,[440600,,LFILE+1]
	MOVEI	X2,3
	MOVE	X3,[440700,,EBUF]
NETFI5:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,NETFI5
	ENDR
; NETWORK UTILITY -- MESSAGE INPUT
;
NUTMI:	BEGINR
	IN	DCCHAN,
	 CAIA
	  JRST	NETEIT
	SKIPE	FLAGDD
	 CALLR	NUTDD
	ENDR

; NETWORK UTILITY -- MESSAGE OUTPUT
;   IN: X1 -- POINTER TO ASCIZ MESSAGE STRING
;
NUTMO:	BEGINR	<IO,BP>
	SKIPE	FLAGDD
	 OUTSTR (X1)
	MOVEI	BP,(X1)
	TLOA	BP,440700
NUTMOB:	 IDPB	IO,DCOBUF+1
	ILDB	IO,BP
	JUMPE	IO,RETN(0)
NUTMOL:	SOSL	DCOBUF+2
	 JRST	NUTMOB
NUTMOO:	OUT	DCCHAN,
	 JRST	NUTMOL
	JRST	NETEOT
	ENDR

; NETWORK UTILITY -- DISPLAY DATALANGUAGE
;
NUTDD:	BEGINR	<IO,UTIL>
	MOVE	X1,DCIBUF+1
	MOVE	UTIL,DCIBUF+2
NUTDDL:	SOJL	UTIL,RETN(0)
	ILDB	IO,X1
	JUMPE	IO,NUTDDL
	TBOUT	IO
	JRST	NUTDDL
	ENDR
; NETWORK UTILITY -- FILL A DESIGNATED BUFFER
;   IN: IO -- SIZE OF BUFFER (- IF EOF POSSIBLE),,ADDRESS OF BUFFER
;
NUTFB:	BEGINR
	HLRE	X1,IO
	MOVMS	X1
	HRRZI	X2,(IO)
	SKIPLE	DDIBUF+2
	 JRST	NUTFB2
NUTFB1:
IFE F.SAIL,<
	SKIPL	IO
	 JRST	NUTFB$
	STATZ	DDCHAN,020000
	 RETURN
	MOVE	X3,DCDBLK+.IBDEV
	MOVEM	X3,WRKBLK+.IBDEV
	MOVE	X3,DCDBLK+.IBLCL
	MOVEM	X3,WRKBLK+.IBLCL
	MOVE	X3,SWRK
	CALL	X3,[SIXBIT/IMPUUO/]
	 JRST	NUTFB$
	LDB	X3,[000600,,WRKBLK+.IBSTT]
	JUMPE	X3,RETN(0)
NUTFB$:
>
	IN	DDCHAN,
	 JRST	NUTFB2
	SKIPL	IO
	 THUD
	STATO	DDCHAN,020000
	 THUD
	RETURN
NUTFB2:	IBP	DDIBUF+1	;Ensure RH valid due to CMU bug
	HRL	X2,DDIBUF+1
	SOS	X3,DDIBUF+2
	CAIL	X3,(X1)
	 MOVEI	X3,-1(X1)
	ADDM	X3,DDIBUF+1
	ADDI	X3,(X2)
	BLT	X2,(X3)
	SUB	X1,DDIBUF+2
	SOJLE	X1,NUTFB3
	MOVEI	X2,1(X3)
	JRST	NUTFB1
NUTFB3:	MOVNM	X1,DDIBUF+2
	SKIPL	IO
	 RETURN
	ENDR	SKIP,1
; FATAL NETWORK ERROR MESSAGES
;
; (((NOT SAIL)))
IFE F.SAIL,<
ICPERD:	OUTSTR	[ASCIZ / ?? Restart failure ??/]
	EXIT
ICPEIL:	OUTSTR	[ASCIZ / ?? Input socket listen failure ??/]
	EXIT
ICPEOL:	OUTSTR	[ASCIZ / ?? Output socket listen failure ??/]
	JRST	QUIT04
ICPET:	OUTSTR	[ASCIZ / ?? ICP failure (transfer) ??/]
	RELEAS	DCCHAN,		; CLOSE AS STANDARD DEVICE
ICPEZ:	MOVE	IO,CICP
	CALL	IO,[SIXBIT/IMPUUO/]	; CLOSE CONNECTION
	 JRST	ICPEC
	JRST	QUIT03
ICPEF:	OUTSTR	[ASCIZ / ?? ICP failure (file control) ??/]
	JRST	ICPEZ
ICPEC:	OUTSTR	[ASCIZ / The datacomputer is unavailable/]
	MOVE	0,ICPBLK+.IBERR
	CAIN	0,.IESOF	; SOCKET OPEN FAILURE
	 OUTSTR	[ASCIZ / (rejecting)/]
	CAIN	0,.IEDWN
	 OUTSTR	[ASCIZ / (down)/]
	CAIN	0,.IETIM
	 OUTSTR	[ASCIZ / (timeout)/]
	OUTSTR	[ASCIZ /.
/]
	MOVE	IO,CICP
	CALL	IO,[SIXBIT/IMPUUO/]
	 JRST	QUIT03
	JRST	QUIT03
NETEIC:	OUTSTR	[ASCIZ / ?? Input failure (connection) ??/]
	EXIT
NETEOC:	OUTSTR	[ASCIZ / ?? Output failure (connection) ??/]
	JRST	QUIT04
NETECF:	OUTSTR	[ASCIZ / ?? File control failure ??/]
	JRST	QUIT03
>
; (((↑↑↑)))
NETEIT:	OUTSTR	[ASCIZ / ?? Input failure (transfer) ??/]
	JRST	QUIT
NETEOT:	OUTSTR	[ASCIZ / ?? Output failure (transfer) ??/]
	JRST	QUIT
; (((SAIL)))
IFE F.SAIL,<
OICP:	.IUCON,,ICPBLK
CICP:	.IUCLS,,ICPBLK
LINP:	.IULSN,,DCIBLK
OINP:	.IUCON,,DCIBLK
CINP:	.IUCLS,,DCIBLK
LOUT:	.IULSN,,DCOBLK
OOUT:	.IUCON,,DCOBLK
COUT:	.IUCLS,,DCOBLK
ODAT:	001000+.IUCON,,DCDBLK	; 60 SEC TIMEOUT 4*2↑(BITS 8-10)
CDAT:	.IUCLS,,DCDBLK
PWRK:	.IULHS,,WRKBLK
SWRK:	.IUSTT,,WRKBLK
CWRK:	.IUCLS,,WRKBLK
>
; (((↑↑↑)))

;(((SAIL)))
IFN F.SAIL,< 
; CLSCHK - ROUTINE TO CHECK IF SOCKET CLOSED ON ME

CLSCHK:	BEGINR
	MTAPE DCCHAN,STTBLK
	MOVE X1,STTBLK+1
	IOR X1,STTBLK+2
	STATO DCCHAN,ERRBTS
	TLNN X1,060000
	 RETURN SKIP,1
	ENDR
>
;(((↑↑↑↑)))
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR <IO>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOI1
IFE F.SAIL,<
	LOOKUP	LFCHAN,LFILEB	; PREPARE FILE FOR INPUT
>
IFN F.SAIL,<	; SAIL DOES NOT HAVE EXTENDED LOOKUP
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3		; MUST CLEAR FOR SAIL PPN'S
	LOOKUP LFCHAN,LFILE	; PREPARE FILE FOR INPUT
>
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	OUTSTR	[ASCIZ / ?? Local channel OPEN failure ??
/]
	RELEAS	LFCHAN,
	RETURN
LOCOI2:	OUTSTR	[ASCIZ / (Local file not found)
/]
	RELEAS	LFCHAN,
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR	<IO,<IO+1>>
	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS
	 JRST	LOCOO2
	MOVE	IO,<LFILE+1>
	MOVE	<IO+1>,<LFILE+2>
	SETZM LFILE+3
	LOOKUP	LFCHAN,LFILE
	 JRST	LOCOO1
	TAIN	<[ASCIZ / [Old Local File][Confirm]/]>
	 JRST	LOCOO3
	 JRST	LOCOO3
	JRST	LOCOO1
LOCOO3:	RELEAS	LFCHAN,
	RETURN
LOCOO1:	RELEAS	LFCHAN,
	OPEN	LFCHAN,LFCHAS	; INITIALIZE LOCAL CHANNEL
	 JRST	LOCOO2
	MOVEM	IO,<LFILE+1>
	MOVEM	<IO+1>,<LFILE+2>
IFE F.SAIL,<
	ENTER	LFCHAN,LFILEB	; PREPARE FILE FOR OUTPUT
>
IFN F.SAIL,<	; NO EXTENDED ENTER ON SAIL
	MOVE IO,LFIPPN
	MOVEM IO,LFILE+3
	ENTER LFCHAN,LFILE	; PREPARE FILE FOR OUTPUT
>
	 JRST	LOCOO2
	RETURN	SKIP,1
LOCOO2:	OUTSTR	[ASCIZ/ (Local file creation failure)
/]
	RELEAS	LFCHAN,
	ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	SKIPE	FLAGFE
	 RETURN
	RELEAS	LFCHAN,
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: IO -- SIZE IN WORDS
;
LOCS:	BEGINR
IFE F.SAIL,<
	MOVE	IO,LFILE+3	; SIZE IN WORDS FROM EXTENDED LOOKUP
>
IFN F.SAIL,<	; SAIL HAS A FULL WORD SWAPPED -LENGTH(HOW SEXY!!!)
	MOVS IO,LFILE+3		; - LENGTH
	MOVNS IO		; + LENGTH
>		; DON'T YOU WISH BOTTOMS-10 WERE SMART LIKE THIS?
	ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR	<IO>
	SETZM	GBUF1
	LDB	X1,[350700,,FBUF]
	CAIN	X1,"*"
	 SETOM	GBUF1
	SETZM	GBUF2
	LDB	X1,[350700,,EBUF]
	CAIN	X1,"*"
	 SETOM	GBUF2
	SETO	X1,
	CAME	X1,FSBUF
	 CAMN	X1,ESBUF
	  CAIA
	   JRST	LOCFI5
	SETZM	LUTDSP
LOCFI1:	CALLR	LUTDS
	 CAIA
	  JRST	LOCFI6
	OUTSTR	[ASCIZ/ (No such file)
/]
	RETURN
LOCFI6:	SETO	X1,
	CAME	X1,FSBUF
	 JRST	LOCFI2
	CAME	X1,ESBUF
	 JRST	LOCFI3
	JRST	LOCFI4
LOCFI2:	MOVE	X1,[440700,,FSBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCFI7:	ILDB	X3,X1
	ILDB	X4,X2
	JUMPE	X3,LOCFI8
	CAIN	X3,(X4)
	 JRST	LOCFI7
	JRST	LOCFI1
LOCFI8:	JUMPE	X4,LOCFI4
	CAIN	X4,"."
	 JRST	LOCFI4
	JRST	LOCFI1
LOCFI3:	MOVE	X1,[440700,,ESBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCFI9:	ILDB	X4,X2
	JUMPE	X4,LCFI10
	CAIE	X4,"."
	 JRST	LOCFI9
LCFI12:	ILDB	X4,X2
LCFI10:	ILDB	X3,X1
	JUMPE	X3,LCFI11
	CAIN	X3,(X4)
	 JRST	LCFI12
	JRST	LOCFI1
LCFI11:	JUMPE	X4,LOCFI4
	JRST	LOCFI1
LOCFI4:	HRRZI	IO,LUTDSF
	CALLR	LUTFN
LOCFI5:	CALLR	LOCOI
	 RETURN
	CALLR	LOCC
	ENDR	SKIP,1
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR	<IO>
	CALLR	LOCC
	SETO	X1,
	CAME	X1,FSBUF
	 CAMN	X1,ESBUF
LOCNI0:	  CALLR	LUTDS
	   RETURN SKIP,1
	SETO	X1,
	CAME	X1,FSBUF
	 JRST	LOCNI1
	CAME	X1,ESBUF
	 JRST	LOCNI2
	JRST	LOCNI3
LOCNI1:	MOVE	X1,[440700,,FSBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCNI6:	ILDB	X3,X1
	ILDB	X4,X2
	JUMPE	X3,LOCNI7
	CAIN	X3,(X4)
	 JRST	LOCNI6
	JRST	LOCNI0
LOCNI7:	JUMPE	X4,LOCNI3
	CAIN	X4,"."
	 JRST	LOCNI3
	JRST	LOCNI0
LOCNI2:	MOVE	X1,[440700,,ESBUF]
	MOVE	X2,[440700,,LUTDSF]
LOCNI8:	ILDB	X4,X2
	JUMPE	X4,LCNI10
	CAIE	X4,"."
	 JRST	LOCNI8
LOCNI9:	ILDB	X4,X2
LCNI10:	ILDB	X3,X1
	JUMPE	X3,LCNI11
	CAIN	X3,(X4)
	 JRST	LOCNI9
	JRST	LOCNI0
LCNI11:	JUMPE	X4,LOCNI3
	JRST	LOCNI0
LOCNI3:	HRRZI	IO,LUTDSF
	CALLR	LUTFN
	CALLR	LOCOI
	 JRST LOCNI0
	TSOUT	<[ASCIZ/ (/],LUTDSF,RPAREN>
	SKIPN	GBUF1
	 JRST	LOCNI4
	MOVE	X1,[440600,,LFILE]
	MOVEI	X2,6
	MOVE	X3,[440700,,FBUF]
LCNI12:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,LCNI12
LOCNI4:	SKIPN	GBUF2
	 RETURN
	MOVE	X1,[440600,,LFILE+1]
	MOVEI	X2,3
	MOVE	X3,[440700,,EBUF]
LCNI13:	ILDB	X4,X1
	SKIPE	X4
	 ADDI	X4,40
	IDPB	X4,X3
	SOJG	X2,LCNI13
	ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR	<IO>
	SETZ	X1,
	SETO	X2,
	CAMN	X2,FSBUF
	 TRO	X1,400000
	CAMN	X2,ESBUF
	 TRO	X1,200000
	JUMPE	X1,RETN(0)
	MOVE	X2,[440700,,ABUF]
	MOVE	X3,[440700,,FSBUF]
	TRNE	X1,400000
	 HRRI	X3,FBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
	SKIPN	ESBUF
	 JRST	LOCNO0
	MOVEI	X4,"."
	DPB	X4,X2
	MOVE	X3,[440700,,ESBUF]
	TRNE	X1,200000
	 HRRI	X3,EBUF
	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,.-4
LOCNO0:	MOVEI	IO,ABUF
	CALLR	LUTFN
	TSOUT	<[ASCIZ/ (/],ABUF,RPAREN>
	ENDR
; LUTFN -- LOCAL UTILITY: ASCII TO SIXBIT FILE NAME CONVERSION
; IN: IO -- POINTER TO ASCIZ STRING
;
LUTFN:	BEGINR	<IO,BP,UTIL>
	HRRI	BP,(IO)
	HRLI	BP,440700
	SETZM	LFILE		; CLEAR OLD FILE NAME
	SETZM	LFILE+1		;   AND EXTENSION
	SETZM	LFILE+2
IFN F.SAIL,<SETZM LFILE+3>
	MOVEI	X1,LUTFNT	; INITIALIZE XCT PNTR
	MOVEI	X2,LFILE	; SET DESTINATION OF IOR
	SETZ	UTIL,
LUTFN1:	ILDB	IO,BP
	JUMPE	IO,RETN(0)
	CAIN	IO,"."	; PREPARE FOR FILE EXTENSION IF "."
	 JRST	LUTFN2
	CAILE	UTIL,5
	 JRST	LUTFN1
	ADDI	IO,40	; CONVERT TO SIXBIT BY ADDITION
	ANDI	IO,77	;   AND REMOVAL OF HIGH BITS
	XCT	(X1)		; EXECUTE THE PROPER ROTATE
	IORM	IO,(X2)	; IOR RESULT INTO FILE OR FILE+1
	AOJ	X1,		; INCREMENT THE XCT PNTR
	AOJA	UTIL,LUTFN1
LUTFN2:	CAIN	X2,LFILE+1
	 JRST	RETN(0)		; IGNORE MULTIPLE EXTENSIONS
	MOVEI	X1,LUTFNT	; RESET PNTRS FOR EXTENSION
	MOVEI	X2,LFILE+1
	MOVEI	UTIL,3
	JRST	LUTFN1
LUTFNT:	ROT	IO,-6	; HIGH ORDER
	ROT	IO,-14
	ROT	IO,22
	ROT	IO,14
	ROT	IO,6
	ROT	IO,0		; LOW ORDER
	ENDR
; LUTDS -- LOCAL UTILITY: DIRECTORY SCAN
;
LUTDS:	BEGINR
	SKIPN	LUTDSP
	 JRST	LUTDSS
LUTDS1:	JSP X1,LUTDSI
	JUMPE X2,[	JSP X1,LUTDSI
			; (((SAIL)))
			IFN F.SAIL,<
			REPEAT ↑D14,<JSP X1,LUTDSI>
			>
			; (((↑↑↑)))
			JRST LUTDS1]	; IGNORE HOLES IN DIRECTORY
	MOVE X3,[440700,,LUTDSF]
LUTDS2:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS2
	MOVEI X1,"."
	IDPB X1,X3
	JSP X1,LUTDSI
	ANDCMI X2,-1
LUTDS3:	SETZ X1,
	LSHC X1,6
	ADDI X1," "
	IDPB X1,X3
	JUMPN X2,LUTDS3
	SETZ X1,
	IDPB X1,X3
; (((SAIL)))
IFN F.SAIL,<
REPEAT ↑D14,<JSP X1,LUTDSI>		;IGNORE EXTRA SAIL UFD CRUFT
>
; (((↑↑↑)))
	RETURN	SKIP,1
LUTDSI:	SOSG LDIBUF+2
	 IN LDCHAN,
	  CAIA
	   JRST LUTDSD
	ILDB X2,LDIBUF+1
	JRST (X1)
LUTDSS:	RELEAS	LDCHAN,
	MOVE	X1,LFIPPN
	MOVEM	X1,LDIR
	MOVE	X1,LFCHAS+1
	MOVEM	X1,LDCHAS+1
	MOVE	X1,[SIXBIT/UFD/]
	MOVEM	X1,LDIR+1
	SETZM	LDIR+2
IFE F.SAIL,<MOVE X1,[1,,1]>
IFN F.SAIL,<MOVE X1,[SIXBIT/  1  1/]>
	MOVEM	X1,LDIR+3
	OPEN	LDCHAN,LDCHAS
	 JRST	LUTDSE
	LOOKUP	LDCHAN,LDIR
	 JRST	LUTDSE
	SETOM LUTDSP
	JRST LUTDS1
LUTDSD:	STATO	LDCHAN,20000
LUTDSE:	 OUTSTR	[ASCIZ/ ?? Local directory failure ??
/]
	RELEAS	LDCHAN,
	ENDR
; LUTTNS -- LOCAL UTILITY: TIME NUMBER TO STRING
;   IN: IO -- DATE INTEGER
;	UTIL -- TIME INTEGER
;	BP -- BYTE POINTER TO DESTINATION STRING
;   OUT: BP -- UPDATED BYTE POINTER
;
LUTTNS:	BEGINR
	MOVE	X1,IO
	IDIVI	X1,↑D31
	MOVEI	X3,(X1)
	MOVEI	X1,1(X2)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1,"-"
	IDPB	X1,BP
	MOVEI	X1,(X3)
	IDIVI	X1,↑D12
	MOVEI	X3,(X1)
	HRRI	X1,LUTTM(X2)
	HRLI	X1,440700
	SCOPY	(X1,BP)
	MOVEI	X1,"-"
	IDPB	X1,BP
	MOVEI	X1,↑D64(X3)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1," "
	IDPB	X1,BP
	MOVE	X1,UTIL
	IDIVI	X1,↑D60
	MOVEI	X3,(X2)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	MOVEI	X1,":"
	IDPB	X1,BP
	MOVEI	X1,(X3)
	IDIVI	X1,↑D10
	ADDI	X1,"0"
	ADDI	X2,"0"
	IDPB	X1,BP
	IDPB	X2,BP
	SETZ	X1,
	IDPB	X1,BP
	ENDR
; LUTTSN -- LOCAL UTILITY: TIME STRING TO NUMBER
;   IN: IO -- ADDRESS OF TIME STRING
;   OUT: IO -- DATE INTEGER
;	 UTIL -- TIME INTEGER
;
LUTTSN:	BEGINR	<BP>
	MOVE	BP,IO
	SETZ	IO,
	SETZ	UTIL,
	ILDB	X1,BP
	CAIL	X1,"0"
	 CAILE	X1,"9"
	  RETURN
	MOVEI	X4,-"0"(X1)
	IMULI	X4,↑D10
	ILDB	X1,BP
	ADDI	X4,-"0"(X1)
	ILDB	X1,BP
	CAIE	X1,"-"
	 RETURN
	MOVE	X3,[440700,,X2]
	SETZ	X2,
	ILDB	X1,BP
	IDPB	X1,X3
	ILDB	X1,BP
	IDPB	X1,X3
	ILDB	X1,BP
	IDPB	X1,X3
	MOVEI	X3,↑D11
	IOR X2,[1004,,0]	; CANONICALIZE CASES
	CAME	X2,LUTTM(X3)
	 SOJGE	X3,.-1
	JUMPL	X3,RETN(0)
	ILDB	X1,BP
	CAIE	X1,"-"
	 RETURN
	ILDB	X1,BP
	MOVEI	X2,-"0"(X1)
	IMULI	X2,↑D10
	ILDB	X1,BP
	ADDI	X2,-"0"(X1)
	SUBI	X2,↑D64
	IMULI	X2,↑D12
	ADDI	X2,(X3)
	IMULI	X2,↑D31
	ADDI	X2,-1(X4)
	ILDB	X1,BP
	CAIE	X1," "
	 RETURN
	ILDB	X1,BP
	MOVEI	X3,-"0"(X1)
	IMULI	X3,↑D10
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	IMULI	X3,6
	ILDB	X1,BP
	CAIE	X1,":"
	 RETURN
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	IMULI	X3,↑D10
	ILDB	X1,BP
	ADDI	X3,-"0"(X1)
	MOVE	IO,X2
	MOVE	UTIL,X3
	ENDR

; MONTH TABLE FOR LOCAL DATE CONVERSION
;
LUTTM:	ASCII	/Jan/
	ASCII	/Feb/
	ASCII	/Mar/
	ASCII	/Apr/
	ASCII	/May/
	ASCII	/Jun/
	ASCII	/Jul/
	ASCII	/Aug/
	ASCII	/Sep/
	ASCII	/Oct/
	ASCII	/Nov/
	ASCII	/Dec/
; OOPS -- THE IMPOSSIBLE HAS HAPPENED
;
OOPS:	MOVE	IO,[IN DDCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERDD
	MOVE	IO,[OUT DDCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERDD
	MOVE	IO,[IN LFCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERLF
	MOVE	IO,[OUT LFCHAN,]
	CAMN	IO,-3(FLAG)
	 JRST	IOERLF
	OUTSTR	[ASCIZ/ ?? Impossible event at /]
	MOVEI	IO,-1(FLAG)
	TNOUT	(IO,10)
	OUTSTR	[ASCIZ / ??/]
	EXIT
IOERDD:	GETSTS	DDCHAN,ABUF
	CAIA
IOERLF:	 GETSTS	LFCHAN,ABUF
	OUTSTR	[ASCIZ/ ?? Data error at /]
	MOVEI	IO,-3(FLAG)
	TNOUT	(IO,10)
	OUTSTR	[ASCIZ/ with status /]
	MOVE	IO,ABUF
	TNOUT	(IO,10)
	OUTSTR	[ASCIZ / ??
/]
	SETOM	FLAGDE
	CALLR	RENDER
	 JRST	QUIT
	JRST	QUIT
>
; (((↑↑↑)))
	SUBTTL System Dependent Routines for TENEX

; (((TENEX)))
IFG F.TENX,<
; SYSTEM INITIALIZATION
;
S$INIT:	BEGINR
	MOVE	X1,[SIXBIT/DFTP/]
	SETNM
	HRRZI	X1,-1
	RFMOD
	TRZ	X2,006000	; (1B24+1B25)
	SFMOD
	MOVE	X2,[BYTE (2) 1,0,1,1,1,1,1,2,1,2,2,1,1,2,1,1,1,1]
	MOVE	X3,[BYTE (2) 0,1,1,0,1,1,0,1,1,3,1,1,1,2]
	SFCOC
	MOVEI	X1,400000	; FOR THIS FORK
	MOVE	X2,[LEVTAB,,CHNTAB]
	SIR			; SET UP INTERRUPT TABLES
	EIR			; ENABLE INTERRUPTS
	MOVE	X1,[17,,0]	; ↑O ON CHANNEL 0
	ATI
	MOVEI	X1,400000	; FOR THIS FORK
	MOVE	X2,[1B0+1B10+1B11+1B15] ; TTY, EOF, DATA ERROR, ILI
	AIC			; ACTIVATE CHANNELS
	SETZM	FLAGCO
	SETZM	FLAGEF
	SETZM	FLAG20
	MOVE	X1,[SIXBIT/LOADTB/]
	SYSGT
	SKIPN	X2
	 SETOM	FLAG20
	CALLR	ICP
	ENDR
; GETFIL -- GET-RETRIEVE FILE INFORMATION
;
GETFIL:	BEGINR	<BP,UTIL>
	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVEM	X3,NTIME
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,FBUF]
	MOVNI	X3,GET$F
	SETOM	FLAGEF
	SIN
	SKIPN	FLAGEF
	 RETURN
	SETZM	FLAGEF
	MOVEI	BP,GET$F
	MOVEM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,EBUF]
	MOVNI	X3,GET$E
	SIN
	MOVEI	BP,GET$E
	ADDM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,GET$D
	SIN
	MOVEI	BP,GET$D
	ADDM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,[440700,,PAGE]
	SETZ	X2,
	IDTIM
	 SETZ	X2,
	MOVEM	X2,ABUF
	MOVE	X1,DCDJFN
	BIN
	AOS	NSIZE
	ADDM	X2,NSUM
	MOVEM	X2,<ABUF+1>
	BIN
	AOS	NSIZE
	ADDM	X2,NSUM
	MOVEM	X2,<ABUF+2>
	ENDR	SKIP,1
; GETDAT -- GET-RETRIEVE FILE DATA
;
GETDAT:	BEGINR	<IO,BP,UTIL>
	SETZ	UTIL,
	MOVE	X1,DCDJFN
	BIN
	ADDM	X2,NSUM
	MOVN	IO,X2
	ADDI	X2,3
	ADDM	X2,NSIZE
	JUMPE	IO,GETD2
GETD1:	CALLR	NETMSG
	 JRST	GETD7
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SIN
	HRRZ	X1,LJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SKIPN	FLAGFE
	 SOUT
	MOVN	BP,IO
	CAILE	BP,SIZPAG
	 MOVEI	BP,SIZPAG
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDI	IO,SIZPAG
	JUMPL	IO,GETD1
GETD2:	MOVE	X1,DCDJFN
	BIN
	ADD	UTIL,X2
	ADDM	UTIL,NSUM
	BIN
	ADDM	X2,NSUM
	CAMN	X2,UTIL
	 JRST	GETD3
	TSOUT	<[ASCIZ/ (File checksum error)/],CRLF>
GETD3:	SKIPE	FLAGFE
	 JRST	GETD8
	HRROI	X1,LFILE
	HRRZ	X2,LJFN
	MOVE	X3,[022220,,000001]
	JFNS
	CALLR	LOCC
	SETO	X1,
	CAMN	X1,FSBUF
	 JRST	GETD4
	CAMN	X1,ESBUF
	 JRST	GETD4
	CAMN	X1,VSBUF
	 JRST	GETD4
	JRST	GETD5
GETD4:	HRROI	X1,[ASCIZ/  /]
	PSOUT
	HRROI	X1,LFILE
	PSOUT
	HRROI	X1,CRLF
	PSOUT
GETD5:	CALLR	LOCOI
	 JRST	GETD8
	MOVE	X3,<ABUF+2>
	JUMPLE	X3,GETD6
	HRR	X1,LJFN
	HRLI	X1,11		; OFFSET 11
	HRLZI	X2,007700	; BYTESIZE (B6-B11)
	LSH	X3,30
	CHFDB
	HRR	X1,LJFN
	HRLI	X1,12		; OFFSET 12 (BYTE COUNT)
	SETO	X2,
	MOVE	X3,<ABUF+1>
	CHFDB
GETD6:	SKIPN	ABUF
	 JRST	GETD8
	MOVEI	X1,400000
	RPCAP
	TRNN	X2,600000	; (1B18+1B19) WHEEL OR OPER
	 JRST	GETD8
	MOVE	UTIL,X3
	TRO	X3,(X2)
	EPCAP			; ENABLE (!)
	HRR	X1,LJFN
	HRLI	X1,14		; OFFSET 14 (LAST WRITE)
	SETO	X2,
	MOVE	X3,ABUF
	CHFDB
	MOVEI	X1,400000
	MOVE	X3,UTIL
	EPCAP			; RESET CAPABILITIES
	JRST	GETD8
GETD7:	MOVE	X1,DCDJFN
GETD9:	SIBE
	 CAIA
	  JRST	GETD8
	BIN
	JRST	GETD9
GETD8:	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	SUBM	X3,NTIME
	ENDR
; PUTFIL -- PUT-STORE FILE INFORMATION
;
PUTFIL:	BEGINR	<BP,UTIL>
	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVEM	X3,NTIME
	MOVE	BP,[440700,,PAGE]
	MOVE	UTIL,[440700,,FBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	MOVE	UTIL,[440700,,EBUF]
	SCOPY	(UTIL,BP)
	MOVE	BP,UTIL
	HRRZ	X1,LJFN
	MOVE	X2,[1,,14]	; 1 WORD, OFFSET 14 (LAST WRITE)
	HRRZI	X3,UBUF1
	GTFDB
	 JRST	PUTF1
	SETZ	X1,
	IDPB	X1,BP
	JRST	PUTF2
PUTF1:	MOVE	X1,BP
	MOVE	X2,UBUF1
	SETZ	X3,
	ODTIM
	IBP	X1
	MOVE	BP,X1
PUTF2:	GTAD
	MOVE	X2,X1
	MOVE	X1,BP
	ODTIM
	IBP	X1
	MOVEI	BP,(X1)
	MOVE	UTIL,VBUF
	MOVEM	UTIL,1(BP)
	ADDI	BP,1
	HRRZ	X1,LJFN
	MOVE	X2,[2,,11]	; 2 WORDS, OFFSET 11 (BYTESIZE & COUNT)
	HRRZI	X3,UBUF1
	GTFDB
	 JRST	PUTF3
	SETZM	UBUF1
	SETZM	<UBUF1+1>
PUTF3:	MOVE	UTIL,<UBUF1+1>
	MOVEM	UTIL,1(BP)
	LDB	UTIL,[300600,,UBUF1]
	MOVEM	UTIL,2(BP)
	ADDI	BP,2
	MOVEI	UTIL,1(BP)
	SUBI	UTIL,PAGE
	MOVEM	UTIL,NSIZE
	MOVEI	BP,-1(UTIL)
	SETZ	UTIL,
	ADD	UTIL,PAGE(BP)
	SOJGE	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVN	X3,NSIZE
	SOUT
	ENDR
; PUTDAT -- PUT-STORE FILE DATA
;
PUTDAT:	BEGINR	<IO,BP,UTIL>
	CALLR	LOCS
	MOVE	X1,DCDJFN
	MOVE	X2,IO
	BOUT
	ADDM	X2,NSUM
	ADDI	X2,2
	ADDM	X2,NSIZE
	MOVN	IO,IO
	SETZ	UTIL,
	JUMPE	IO,PUTD2
PUTD1:	HRRZ	X1,LJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SIN
	CALLR	NETMSG
	 JRST	PUTD3
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SOUT
	MOVN	BP,IO
	CAILE	BP,SIZPAG
	 MOVEI	BP,SIZPAG
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDI	IO,SIZPAG
	JUMPL	IO,PUTD1
PUTD2:	MOVE	X1,DCDJFN
	MOVE	X2,UTIL
	BOUT
	ADDM	UTIL,NSUM
	ADDM	UTIL,NSUM
	MOVEI	X2,21
	MTOPR
PUTD3:	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	SUBM	X3,NTIME
	ENDR
; EXAFIL -- EXAMINE FILE... READ AND LIST TO TERMINAL
;
EXAFIL:	BEGINR	<IO,BP,UTIL>
	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	MOVEM	X3,NTIME
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,FBUF]
	MOVNI	X3,GET$F
	SETOM	FLAGEF
	SIN
	SKIPN	FLAGEF
	 RETURN
	SETZM	FLAGEF
	MOVEI	BP,GET$F
	MOVEM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<FBUF-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,EBUF]
	MOVNI	X3,GET$E
	SIN
	MOVEI	BP,GET$E
	ADDM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<EBUF-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,GET$D
	SIN
	MOVEI	BP,GET$D
	ADDM	BP,NSIZE
	SETZ	UTIL,
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDM	UTIL,NSUM
	MOVE	X1,DCDJFN
	BIN
	AOS	NSIZE
	ADDM	X2,NSUM
	BIN
	AOS	NSIZE
	ADDM	X2,NSUM
	SKIPL	DEXA$S
	 JRST	EXAF0
	MOVE	X2,[440700,,FBUF]
EXAF5:	ILDB	X1,X2
	CAILE	X1," "
	 JRST	EXAF5
	SETZ	X1,
	DPB	X1,X2
	MOVE	X2,[440700,,EBUF]
EXAF6:	ILDB	X1,X2
	CAILE	X1," "
	 JRST	EXAF6
	SETZ	X1,
	DPB	X1,X2
	TSOUT	<[ASCIZ/ [/],FBUF,[ASCIZ/./],EBUF,[ASCIZ/]/],CRLF>
EXAF0:	SETZ	UTIL,
	MOVE	X1,DCDJFN
	BIN
	ADDM	X2,NSUM
	MOVN	IO,X2
	ADDI	X2,3
	ADDM	X2,NSIZE
	JUMPE	IO,EXAF2
EXAF1:	CALLR	NETMSG
	 JRST	EXAF3
	MOVE	X1,DCDJFN
	MOVE	X2,[444400,,PAGE]
	MOVNI	X3,SIZPAG
	CAMGE	X3,IO
	 MOVE	X3,IO
	SIN
	PUSH	STAK,IO
	MOVNI	X1,SIZPAG
	CAMGE	X1,IO
	 MOVE	X1,IO
	MOVN	IO,X1
	IMULI	IO,5
	MOVE	BP,[440700,,PAGE]
	CALLR	DEXA$
	POP	STAK,IO
	MOVN	BP,IO
	CAILE	BP,SIZPAG
	 MOVEI	BP,SIZPAG
	ADD	UTIL,<PAGE-1>(BP)
	SOJG	BP,.-1
	ADDI	IO,SIZPAG
	JUMPL	IO,EXAF1
EXAF2:	MOVE	X1,DCDJFN
	BIN
	ADD	UTIL,X2
	ADDM	UTIL,NSUM
	BIN
	ADDM	X2,NSUM
	CAMN	X2,UTIL
	 JRST	EXAF4
	TSOUT	<[ASCIZ/ (File checksum error)/],CRLF>
	JRST	EXAF4
EXAF3:	SKIPA	X1,DCDJFN
EXAF7:	 BIN
	SIBE
	 JRST	EXAF7
	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	SUBM	X3,NTIME
	RETURN
EXAF4:	MOVEI	X1,400000
	RUNTM
	IDIV	X3,X2
	SUBM	X3,NTIME
	ENDR	SKIP,1
; TENEX ICP:		1) GET REMOTE SOCKET NUMBERS FROM ICP SOCKET
;			2) OPEN CONNECTION SOCKETS
;				A) EVEN - INPUT
;				B) ODD - OUTPUT
; JFN STRING:	"NET:<JOB-RELATIVE-SKT>.<FOREIGN-HST>-<FOREIGN-SKT>"
;
ICP:	BEGINR
	MOVE	X1,[440700,,UBUF1]
	HRROI	X2,[ASCIZ/NET:20./]
	SETZ	X3,
	SOUT			; LOCAL SOCKET 20+JOBREL
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT			; FAILURE -- MAKE HOST # INTO STRING
	 JFCL			; CVHST SUCCESS OR NOUT FAILURE
	MOVN	X2,DCSOCK
	NOUT
	 JFCL
	HRLZI	X1,1	; SHORT GTJFN
	HRROI	X2,UBUF1
	GTJFN			; ICP CONNECTION
	 JRST	ICPEG
	MOVE	X2,[40B5+1B19] ; 32-BIT, READ
	OPENF			; OPEN ICP CONNECTION
	 JRST	ICPEO
	BIN
	MOVEM	X2,ICPSOC
	CLOSF
	 JRST	ICPEC
	MOVE	X1,[440700,,UBUF1]
	HRROI	X2,[ASCIZ/NET:22./]
	SETZ	X3,
	SOUT
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT
	 JFCL
	MOVN	X2,ICPSOC
	NOUT
	 JFCL
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN			; OUTPUT JFN
	 JRST	ICPEIG
	MOVEM	X1,DCOJFN
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN			; INPUT JFN
	 JRST	ICPEOG
	MOVEM	X1,DCIJFN
	MOVE	X2,[10B5+6B9+1B19] ; 8-BIT, NO-WAIT, READ
	OPENF
	 JRST	ICPEIO
	MOVE	X1,DCOJFN
	MOVE	X2,[10B5+7B9+1B20] ; 8-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	ICPEOO
	MOVE	X1,[SIXBIT/LHOSTN/]
	SYSGT
	MOVEM	X1,LHOST
	ENDR
; NETWORK QUIT
;
QUIT:	MOVE	X1,DCOJFN
	MOVEI	X2,"Z"-100
	BOUT
	MOVEI	X2,21
	MTOPR
	SETOM	FLAGEF
QUIT01:	DCBIN	<IO>
	SKIPE	FLAGEF
	 JRST	QUIT01
	RESET
	HALTF
	JRST	.-1		; IN CASE OF "CONTINUE"
; NETOI -- NETWORK OPEN INPUT (DATA)
;
NETOI:	BEGINR
	MOVE	X1,[440700,,UBUF1]
	HRROI	X2,[ASCIZ/NET:24./]
	SETZ	X3,
	SOUT
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT
	  JFCL
	MOVN	X2,ICPSOC
	SUBI	X2,3
	NOUT
	 JFCL
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN
	 JRST	NETOI2
	MOVEM	X1,DCDJFN
	MOVE	X2,[44B5+6B9+1B19] ; 36-BIT, NO-WAIT, READ
	OPENF
	 JRST	NETOI1
	RETURN	SKIP,1
NETOI1:	RLJFN
	 JRST	NETOI2
NETOI2:	HRROI	X1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR

; NETOO -- NETWORK OPEN OUTPUT (DATA)
;
NETOO:	BEGINR
	MOVE	X1,[440700,,UBUF1]
	HRROI	X2,[ASCIZ/NET:25./]
	SETZ	X3,
	SOUT
	MOVEI	X2,DCHOST
	MOVEI	X3,10
	CVHST
	 NOUT
	  JFCL
	MOVN	X2,ICPSOC
	SUBI	X2,2
	NOUT
	 JFCL
	HRLZI	X1,1
	HRROI	X2,UBUF1
	GTJFN
	 JRST	NETOO2
	MOVEM	X1,DCDJFN
	MOVE	X2,[44B5+7B9+1B20] ; 36-BIT, NO-WAIT-BUFFERED, WRITE
	OPENF
	 JRST	NETOO1
	RETURN	SKIP,1
NETOO1:	RLJFN
	 JRST	NETOO2
NETOO2:	HRROI	X1,[ASCIZ/ ?? Network connection OPEN failure ??
/]
	PSOUT
	ENDR
; NETC -- NETWORK CLOSE (DATA)
;
NETC:	BEGINR
	MOVE	X1,DCDJFN
	CLOSF
	 JRST	NETC1
	RETURN
NETC1:	HRROI	[ASCIZ/ ?? Network connection CLOSE failure ??
/]
	PSOUT
	ENDR
; NETMSG -- HANDLE PENDING MESSAGES
;
NETMSG:	BEGINR
	SKIPE	FLAGSM
	 RETURN	SKIP,1
NETMS1:	MOVE	X1,DCIJFN
	SIBE
	 CAIA
	RETURN	SKIP,1
	BIN
	SKIPN	FLAGDD
	 JRST	NETMS5
	HRRZI	X1,(X2)
	PBOUT
NETMS5:	CAIN	X2,"!"
	 JRST	NETMS2
	CAIN	X2,"+"
	 JRST	NETMS3
	CAIN	X2,"-"
	 JRST	NETMS3
	CAIN	X2,"."
	 JRST	NETMS4
	CAIN	X2,"?"
	 JRST	DEATH
	CALLR	RENLIN
	JRST	NETMS1
NETMS2:	CALLR	RENLIP
	JRST	NETMS1
NETMS3:	CALLR	RENLIP
	RETURN
NETMS4:	SETOM	FLAGSM
	CALLR	RENLIN
	ENDR	SKIP,1
; NETDSI -- NETWORK: NUMBER OF DATA SOCKET FOR INPUT
;   OUT: UTIL
;
NETDSI:	BEGINR
	GJINF
	HRRZI	UTIL,(X2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,24
	ENDR

; NETDSO -- NETWORK: NUMBER OF DATA SOCKET FOR OUTPUT
;   OUT: UTIL
;
NETDSO:	BEGINR
	GJINF
	HRRZI	UTIL,(X2)	; CONNECT DIRECTORY
	LSH	UTIL,↑D15	; PAST 5 LOW DIGITS
	ADDI	UTIL,25
	ENDR
; NETFFI -- NETWORK FIX FIRST FILE NAME
;
NETFFI:	BEGINR
	MOVE	X2,LJFN
	TLNN	X2,770000
	 JRST	NETFI1
	HRROI	X1,LFILE
	HRRZI	X2,(X2)
	SETZ	X3,
	JFNS
	MOVE	X1,[LFILE,,UBUF2]
	CALLR	LUTVR
	HRROI	X1,[ASCIZ/  /]
	PSOUT
	HRROI	X1,UBUF2
	PSOUT
	HRROI	X1,CRLF
	PSOUT
NETFI1:	SKIPN	GBUF1
	 JRST	NETFI2
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,002000
	JFNS
	MOVE	X1,[UBUF2,,FBUF]
	CALLR	LUTVR
NETFI2:	SKIPN	GBUF2
	 JRST	NETFI3
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,000200
	JFNS
	MOVE	X1,[UBUF2,,EBUF]
	CALLR	LUTVR
NETFI3:	SKIPL	VSBUF
	 RETURN
	MOVN	X1,VBUF
	MOVEM	X1,VSBUF
	ENDR
; FATAL NETWORK ERROR MESSAGES
;
NETEQ:	PSOUT
	RESET
	HALTF
	JRST	.-1
ICPEG:	HRROI	X1,[ASCIZ/ The datacomputer is unavailable (network)./]
	JRST	NETEQ
ICPEO:	HRROI	X1,[ASCIZ/ The datacomputer is unavailable (down)./]
	JRST	NETEQ
ICPEC:	HRROI	X1,[ASCIZ/ ?? ICP CLOSF failure ??/]
	JRST	NETEQ
ICPEOG:	HRROI	X1,[ASCIZ/ ?? ICP output GTJFN failure ??/]
	JRST	NETEQ
ICPEIG:	HRROI	X1,[ASCIZ/ ?? ICP input GTJFN failure ??/]
	JRST	NETEQ
ICPEIO:	HRROI	X1,[ASCIZ/ ?? ICP output OPENF failure ??/]
	JRST	NETEQ
ICPEOO:	HRROI	X1,[ASCIZ/ ?? ICP input OPENF failure ??/]
	JRST	NETEQ
; LOCOI -- LOCAL OPEN INPUT (FILE)
;
LOCOI:	BEGINR
	HRLZI	X1,100101	; OLD FILE, *'S, SHORT CALL
	MOVE	X2,[440700,,LFILE]
	GTJFN
	 JRST	LOCOI1
	MOVEM	X1,LJFN
	HRRZI	X1,(X1)
	MOVE	X2,[440000,,200000] ; 36-BIT, READ
	OPENF
	 JRST	LOCOI2
	RETURN	SKIP,1
LOCOI1:	HRROI	X1,[ASCIZ/ (Local file not found)
/]
	PSOUT
	RETURN
LOCOI2:	HRROI	X1,[ASCIZ/ (Local file not available)
/]
	PSOUT
	HRRZ	X1,LJFN
	RLJFN
	 RETURN
	ENDR

; LOCOO -- LOCAL OPEN OUTPUT (FILE)
;
LOCOO:	BEGINR
	HRLZI	X1,600001	; VN, WRITE, SHORT
	MOVE	X2,[440700,,LFILE]
	GTJFN
	 JRST	LOCOO2
	MOVEM	X1,LJFN
	MOVE	X2,[440000,,100000] ; 36 BIT BYTE, READ
	OPENF
	 JRST	LOCOO1
	RETURN	SKIP,1
LOCOO1:	HRRZ	X1,LJFN
	RLJFN
	 JFCL
LOCOO2:	HRROI	X1,[ASCIZ/ (Local file creation failure)
/]
	PSOUT
	ENDR
; LOCC -- LOCAL CLOSE (FILE)
;
LOCC:	BEGINR
	SKIPE	FLAGFE
	 RETURN
	HRRZ	X1,LJFN
	CLOSF
	 JRST	LOCC1
	RETURN
LOCC1:	HRROI	X1,[ASCIZ/ ?? Local file CLOSE failure ??
/]
	PSOUT
	ENDR

; LOCS -- LOCAL (FILE) SIZE
;   OUT: IO -- SIZE IN WORDS
;
LOCS:	BEGINR
	HRRZ	X1,LJFN
	MOVE	X2,[2,,11]	; READ 2 WORDS, OFFSET OF 11
	HRRZI	X3,UBUF1
	GTFDB
	 JRST	LOCS1
	SETZ	IO,
	RETURN
LOCS1:	LDB	X1,[300600,,UBUF1] ; FILE BYTESIZE IS B6-11
	MOVEI	X2,↑D36
	IDIVI	X2,(X1)	; BYTES/WD
	MOVE	X3,UBUF1+1	; BYTE COUNT TO EOF
	ADDI	X3,-1(X2)	; ACCOUNT FOR TRUNCATION
	IDIVI	X3,(X2)	; NUMBER OF WORDS
	MOVE	IO,X3
	ENDR
; LOCFFI -- LOCAL FIRST FILE FOR INPUT
;
LOCFFI:	BEGINR
	SETZM	GBUF1
	LDB	X1,[350700,,FBUF]
	CAIN	X1,"*"
	 SETOM	GBUF1
	SETZM	GBUF2
	LDB	X1,[350700,,EBUF]
	CAIN	X1,"*"
	 SETOM	GBUF2
	CALLR	LOCOI
	 RETURN
	SKIPN	GBUF1
	 SKIPE	GBUF2
	  JRST	LOCFI0
	CALLR	LOCC
	RETURN	SKIP,1
LOCFI0:	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	MOVE	X3,[002200,,000001]
	JFNS
	CALLR	LOCC
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 CAIA
	  RETURN SKIP,1
	MOVE	X1,[UBUF2,,UBUF2]
	CALLR	LUTVR
	HRROI	X1,[ASCIZ/ (Bad remote file name /]
	PSOUT
	HRROI	X1,UBUF2
	PSOUT
	HRROI	X1,RPAREN
	PSOUT
	ENDR
; LOCNFI -- LOCAL NEXT FILE FOR INPUT
;
LOCNFI:	BEGINR
	HRRZ	X1,LJFN
	TLO	X1,400000
	CLOSF
	 JFCL
LOCNI1:	MOVE	X1,LJFN
	GNJFN
	 RETURN	SKIP,1
	HRRZI	X1,(X1)
	MOVE	X2,[440000,,200000] ; 36-BIT, READ
	OPENF
	 JRST	LOCNI1
	SKIPL	VSBUF
	 JRST	LOCNI2
	MOVE	X1,[LFILE,,UBUF1]
	BLT	X1,<UBUF1+SBSIZE-1>
LOCNI2:	HRROI	X1,LFILE
	HRRZ	X2,LJFN
	SETZ	X3,
	JFNS
	MOVE	X1,[LFILE,,UBUF2]
	CALLR	LUTVR
	HRROI	X1,[ASCIZ/  /]
	PSOUT
	HRROI	X1,UBUF2
	PSOUT
	HRROI	X1,CRLF
	PSOUT
	SKIPL	VSBUF
	 JRST	LOCNI5
	MOVE	X1,[440700,,LFILE]
	MOVE	X2,[440700,,UBUF1]
LOCNI3:	ILDB	X3,X1
	ILDB	X4,X2
	CAIE	X3,(X4)
	 JRST	LOCNI4
	CAIE	X3,";"
	 JUMPN	X3,LOCNI3
	AOS	VBUF
	JRST	LOCNI5
LOCNI4:	MOVN	X1,VSBUF
	MOVEM	X1,VBUF
LOCNI5:	SKIPN	GBUF1
	 JRST	LOCNI6
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,002000
	JFNS
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 JRST	LOCNI7
	MOVE	X1,[UBUF2,,FBUF]
	CALLR	LUTVR
LOCNI6:	SKIPN	GBUF2
	 RETURN
	HRROI	X1,UBUF2
	HRRZ	X2,LJFN
	HRLZI	X3,000200
	JFNS
	HRRZI	X1,UBUF2
	CALLR	LUTVF
	 JRST	LOCNI7
	MOVE	X1,[UBUF2,,EBUF]
	CALLR	LUTVR
	RETURN
LOCNI7:	HRROI	X1,[ASCIZ/ (Bad remote file name)
/]
	PSOUT
	HRRZ	X1,LJFN
	TLO	X1,400000
	CLOSF
	 JRST	LOCNI1
	JRST	LOCNI1
	ENDR
; LOCNFO -- LOCAL NEXT FILE FOR OUTPUT
;
LOCNFO:	BEGINR
	SETZ	X1,
	SETO	X2,
	CAMN	X2,FSBUF
	 TRO	X1,400000
	CAMN	X2,ESBUF
	 TRO	X1,200000
	CAMN	X2,VSBUF
	 TRO	X1,100000
	JUMPE	X1,RETN(0)
	MOVE	X2,[440700,,LFILE]
	MOVE	X3,[440700,,FSBUF]
	TRNE	X1,400000
	 HRRI	X3,FBUF
LCFFI2:	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,LCFFI2
	SKIPN	ESBUF
	 JRST	LOCNO0
	MOVEI	X4,"."
	DPB	X4,X2
	MOVE	X3,[440700,,ESBUF]
	TRNE	X1,200000
	 HRRI	X3,EBUF
LCFFI3:	ILDB	X4,X3
	CAIN	X4," "
	 SETZ	X4,
	IDPB	X4,X2
	JUMPN	X4,LCFFI3
LOCNO0:	SKIPG	VSBUF
	 RETURN
	MOVEI	X4,";"
	DPB	X4,X2
	MOVE	X1,X2
	MOVE	X2,VSBUF
	MOVEI	X3,↑D10
	NOUT
	 THUD
	ENDR
; LUTVF -- LOCAL UTILITY: VERIFY FILENAME
;   IN: X1 -- POINTER TO STRING TO VERIFY
;
LUTVF:	BEGINR	<X1,X2,X3>
	HRLI	X1,440700
LUTVF0:	ILDB	X2,X1
	JUMPE	X2,RETN(1)
	CAIN	X2,"."
	 JRST	LUTVF0
	CAIN	X2,";"
	 JRST	LUTVF0
	CAIN	X2,"*"
	 JRST	LUTVF0
	CAIN	X2,"V"-100
	 ILDB	X2,X1
	CAIG	X2," "
	 RETURN
	CAIN	X2,"."
	 RETURN
	CAIN	X2,";"
	 RETURN
	CAIN	X2,"*"
	 RETURN
	CAIN	X2,"?"
	 RETURN
	CAIN	X2,":"
	 RETURN
	CAIN	X2,"'"
	 RETURN
	CAIN	X2,42
	 RETURN
	CAIN	X2,"<"
	 RETURN
	CAIN	X2,">"
	 RETURN
	CAIN	X2,177
	 RETURN
	CAIL	X2,"A"+40
	 CAILE	X2,"Z"+40
	  JRST	LUTVF0
	ENDR

; LUTVR -- LOCAL UTILITY: ↑V REMOVAL
;   IN: X1 -- SOURCE,,DESTINATION
;
LUTVR:	BEGINR	<X1,X2,X3>
	HLR	X2,X1
	HRLI	X1,440700
	HRLI	X2,440700
LUTVR0:	ILDB	X3,X2
	CAIN	X3,"V"-100
	 ILDB	X3,X2
	IDPB	X3,X1
	JUMPN	X3,LUTVR0
	ENDR
; PSEUDO-INTERRUPT ROUTINES
;
TCOPSI:	SETOM	FLAGCO
	DEBRK
EOFPSI:	SKIPN	FLAGEF
	 JRST	EOFPSE
	SETZM	FLAGEF
	DEBRK			; RETURN FROM INTERRUPT
EOFPSE:	MOVE	UTIL,X1
	HRROI	X1,[ASCIZ/ ?? Unexpected EOF at /]
	PSOUT
	MOVEI	X1,101
	HRRZ	X2,PSIPC1
	SUBI	X2,1
	MOVEI	X3,10
	SETZ	X4,
	NOUT
	 JFCL
	HRROI	X1,[ASCIZ/ ??
/]
	PSOUT
	MOVE	X1,(X2)
	CAMN	X1,[BIN]
	 JRST	EOFPSD
	CAMN	X1,[BOUT]
	 JRST	EOFPSD
	CAMN	X1,[SIN]
	 JRST	EOFPSD
	CAMN	X1,[SOUT]
	 JRST	EOFPSD
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
EOFPSD:	CAMN	UTIL,DCDJFN
	 JRST	EOFPS2
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
EOFPS2:	SETOM	FLAGDE
	CALLR	RENDER
	 JFCL
	MOVEI	X1,QUIT
	MOVEM	X1,PSIPC1
	DEBRK
DERPSI:	MOVE	UTIL,X1
	HRROI	X1,[ASCIZ/ ?? Data error at /]
	PSOUT
	MOVEI	X1,101
	HRRZ	X2,PSIPC1
	SUBI	X2,1
	MOVEI	X3,10
	SETZ	X4,
	NOUT
	 JFCL
	HRROI	X1,[ASCIZ/ ??
/]
	PSOUT
	MOVE	X1,(X2)
	CAMN	X1,[BIN]
	 JRST	DERPSD
	CAMN	X1,[BOUT]
	 JRST	DERPSD
	CAMN	X1,[SIN]
	 JRST	DERPSD
	CAMN	X1,[SOUT]
	 JRST	DERPSD
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
DERPSD:	CAMN	UTIL,DCDJFN
	 JRST	DERPS2
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
DERPS2:	SETOM	FLAGDE
	CALLR	RENDER
	 JFCL
	MOVEI	X1,QUIT
	MOVEM	X1,PSIPC1
	DEBRK
ILIPSI:	HRROI	X1,[ASCIZ/ ?? Illegal instruction at /]
	CAMN	X2,[-1]
	 HRROI	X1,[ASCIZ/ ?? Impossible event at /]
	PSOUT
	MOVEI	X1,101
	HRRZ	X2,PSIPC1
	SUBI	X2,1
	MOVEI	X3,10
	SETZ	X4,
	NOUT
	 JFCL
	HRROI	X1,[ASCIZ/ ??
/]
	PSOUT
	MOVEI	X1,PSIQUI
	MOVEM	X1,PSIPC1
	DEBRK
PSIQUI:	HALTF
	JRST	PSIQUI
>
; (((↑↑↑)))
	SUBTTL Pure Data

CRLF:	BYTE	(7)15,12,0,0,0
RPAREN:	BYTE	(7)")",15,12,0,0
SEMI:	BYTE	(7)";",15,12,0,0

HOSTS:	5,,[ASCIZ/BBN/]			; TENEXE
	11,,[ASCIZ/HARVARD/]
	13,,[ASCIZ/SUAI/]
	16,,[ASCIZ/CMU/]		; CMU-10B
	37,,[ASCIZ/CCA/]
	40,,[ASCIZ/PARC/]
	43,,[ASCIZ/ISI/]		; ISIR1
	53,,[ASCIZ/OFFICE"-1/]
	56,,[ASCIZ/RUTGERS/]
	61,,[ASCIZ/BBN/]		; TENEXB
	62,,[ASCIZ/BBN/]		; TENEXF
	63,,[ASCIZ/SRI/]		; SRI-KA
	70,,[ASCIZ/SUMEX/]
	102,,[ASCIZ/SRI/]		; SRI-KL
	106,,[ASCIZ/ITS/]		; DMS
	116,,[ASCIZ/CMU/]		; CMU-10A
	126,,[ASCIZ/ISI/]		; ISIA
	161,,[ASCIZ/BBN/]		; TENEXD
	164,,[ASCIZ/ISI/]		; ISIE
	206,,[ASCIZ/ITS/]		; AI
	226,,[ASCIZ/ISI/]		; ISIC
	305,,[ASCIZ/BBN/]		; TENEXA
	306,,[ASCIZ/ITS/]		; ML
	216,,[ASCIZ/CMU/]		; CMU-10D
	326,,[ASCIZ/ISI/]		; ISID
	354,,[ASCIZ/ITS/]		; MC
	361,,[ASCIZ/BBN/]		; TENEXC
	364,,[ASCIZ/ISI/]		; ISIB
	0

	LIT			; LITERALS GO HERE
	SUBTTL Impure Data

; (((ITS)))
IFL F.TENX,<
IOBUFR:	BLOCK 2000
LCLDEV:	BLOCK 1			; local device
LCLFN1:	BLOCK 1
LCLFN2:	BLOCK 1
LCLSNM:	BLOCK 1			; SNAME
RCHBLK:	BLOCK 10		; network status goes here
LCLRCV:	BLOCK 1
LCLTRN:	BLOCK 1
FORRCV:	BLOCK 1
FORTRN:	BLOCK 1
FFITYP:	BLOCK 1
LCLDAT:	BLOCK 1
DIRBLK:	BLOCK 2000
>
; (((↑↑↑)))

; (((TOPS-10)))
IFE F.TENX,<
	RELOC	0

; (((NOT SAIL)))
IFE F.SAIL,<
ICPBLK:	SIXBIT	/IMP/
	0
	100			; LOCAL SOCKET
	40,,DCHOST		; 32 BIT BYTES (ICP), CCA HOST
	DCSOKT			; DATACOMPUTER SOCKET
DCIBLK:	SIXBIT	/IMP/
	0
	102			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP + 1
DCOBLK:	SIXBIT	/IMP/
	0
	103			; LOCAL SOCKET
	10,,DCHOST		; 8 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP
DCDBLK:	SIXBIT	/IMP/
	0
	0			; LOCAL SOCKET (104 RECEIVE, 105 SEND)
	44,,DCHOST		; 36 BIT BYTES, HOST
	0			; CCA SOCKET FROM ICP +2 OR +3
WRKBLK:	BLOCK	5
ICCHAS:	10			; IMAGE MODE
	SIXBIT	/IMP/
	0,,ICPBUF
ICPBUF:	BLOCK	3
DCCHAS:	0			; 7 BIT ASCII MODE
	SIXBIT	/IMP/
	DCOBUF,,DCIBUF
>
; (((↑↑↑)))
DCIBUF:	BLOCK	3
DCOBUF:	BLOCK	3
DDCHAS:	13			; BINARY
	SIXBIT	/IMP/
	DDOBUF,,DDIBUF
DDIBUF:	BLOCK	3
DDOBUF:	BLOCK	3

IFE F.SAIL,<
LFILEB:	0,,5			; EXTENDED LOOKUP-ENTER
>
LFIPPN:	0			; PPN
LFILE:	0			; FILE NAME
	0			; EXTENSION AND DATES
	0			; MODE AND DATES
	0			; SIZE IN WORDS
LFCHAS:	13			; BINARY MODE
	SIXBIT	/DSK/
	LFOBUF,,LFIBUF
LFIBUF:	BLOCK	3
LFOBUF:	BLOCK	3

LDIR:	0			; PROJ-PROG OF USER
	0			; "UFD"
	0
	0			; [1,1]
LDCHAS:	13
	SIXBIT	/DSK/
	0,,LDIBUF
LDIBUF:	BLOCK	3
LUTDSP:	0
LUTDSF:	BLOCK	SBSIZE

EXABUF:	BLOCK	SIZBLK

; (((SAIL)))
IFN F.SAIL,<
CONECB:	BLOCK 7

; OTHER RANDOM THINGS

TERBLK:	3			; TERMINATE BLOCK
	0			; STATUS BITS
	1			; FOREIGN SOCKET LOC
	0			; DON'T WAIT

STTBLK:	2
	BLOCK 2
>
; (((↑↑↑)))
>
; (((↑↑↑)))

; (((TENEX)))
IFG F.TENX,<
LEVTAB:	PSIPC1
	PSIPC2
	PSIPC3
PSIPC1:	BLOCK	1
PSIPC2:	BLOCK	1
PSIPC3:	BLOCK	1
CHNTAB:	1,,TCOPSI
	REPEAT 9,<EXP 0>
	1,,EOFPSI
	1,,DERPSI
	REPEAT 3,<EXP 0>
	1,,ILIPSI
	REPEAT ↑D20,<EXP 0>
FLAGCO:	0
FLAGEF:	0
FLAG20:	0

DCSOCK:	DCSOKT
ICPSOC:	0			; ICP SOCKET
DCIJFN:	0			; DC INPUT JFN
DCOJFN:	0			; DC OUTPUT JFN
DCDJFN:	0			; DC DATA JFN

LFILE:	BLOCK	SBSIZE
LJFN:	0
LDIR:	0

VSBUF:	0

PAGE:	BLOCK	SIZPAG
>
; (((↑↑↑)))

; * VARIABLES

CMDMOD:	0

LHOST:	0

ANCHOR:	ASCIZ	/DFTP/
	BLOCK	<SBSIZE-2>
CONTEX:	BLOCK	LBSIZE
OPENED:	BLOCK	LBSIZE
OPENEM:	0

FLAGDD:	0
FLAGDE:	0
FLAGFE:	0
FLAGNN:	0
FLAGTT:	0
IFN F.TENX!F.SAIL,<
 FLAGSM: 0	; Tenex, Twenex, ITS, SAIL use FLAGSM; Bottoms-10 does not
>
DEXA$L:	0
DEXA$P:	0
DEXA$S:	0

; * BLOCKS

NBUF:	BLOCK	LBSIZE
FBUF:	BLOCK	SBSIZE
EBUF:	BLOCK	SBSIZE
VBUF:	0
FSBUF:	BLOCK	SBSIZE
ESBUF:	BLOCK	SBSIZE

ABUF:	BLOCK	SBSIZE
UBUF1:	BLOCK	LBSIZE
UBUF2:	BLOCK	SBSIZE
GBUF1:	BLOCK	LBSIZE
GBUF2:	BLOCK	LBSIZE

NTIME:	0
NSIZE:	0
NSUM:	0

TCIPCL:	BLOCK	100		; P(OSSIBLE)C(OMMAND)L(IST) [INIT ALL]
TCIPLP:	0			; TCIPCL PTRS (# POSSIBLITIES,,LIST ADR)
	BLOCK	37		;   (SIZE = # CHARS IN LARGEST CMD)
TCIPNF:	0			; P(OSSIBLE)N(EXT)F(REE)

	STSIZ==100
STBEG:	BLOCK	STSIZ

	VAR

	-1			; CRETINOUS LINK-10 BUG

	END	DFTP